-
orw write upSystem hacking training/pwnable.tw 2019. 12. 10. 20:35
pwnable.tw 두번째 문제 orw다.
문제에서 힌트를 얻을 수 있었는데, 문제의 이름이 ORW(=Open Read Write)인 점과, flag의 절대 경로를 알려주는 점에서 open(), read(), write()함수를 이용하여 flag를 직접 읽어야하는 문제이구나~ 라고 생각했다.
메모리 보호기법을 확인해보면 다음과 같이 Partial RELRO, Canary가 걸려있다.
바이너리를 디컴파일하여 main()함수를 확인해보면
orw_seccomp() -> printf() -> read()를 진행한 후, read()함수를 통해 shellcode라는 위치에 0xc8(=200)byte입력받고, call을 해줌으로서 바이너리가 종료된다.
따라서 쉘코드를 입력만 해주면 알아서 call해주는 형식인데, 중요한 부분은 orw_seccomp() 함수다.
orw_seccomp() 함수에서 prctl()함수를 호출하면서 execve()함수의 사용을 제한하고,
read, write, exit, sigreturn syscall만 허용하고 있다.
따라서 이 문제의 핵심은 open("/home/orw/flag") -> read(fd, 임의의 버퍼, size) -> write(1, 임의의 버퍼, size) 형태의 쉘코드를 작성하는 것이다.
처음 페이로드를 작성하려고 보니
open()함수 호출 이후 fd값을 가져와서 read() 함수에 인자값으로 넣어줘야하는데,
open() 함수의 return 값은 eax레지스터에 담기고, 이 값을 어떻게 read() 함수의 인자값으로 넘기는지 몰랐다.
하지만 갓 pwntools의 asm과 shellcraft를 이용하여 다음과 같이 짧고, 간결한 페이로드를 만들 수 있었다.
from pwn import * p = remote('chall.pwnable.tw',10001) p.recvuntil('shellcode:') buf = '' buf += asm(shellcraft.open('/home/orw/flag')) buf += asm(shellcraft.read('eax', 0x804a140, 0x50)) buf += asm(shellcraft.write(1, 0x804a140, 0x50)) p.sendline(buf) p.interactive()
반응형'System hacking training > pwnable.tw' 카테고리의 다른 글
Start write up (0) 2019.12.08