이번에 알게된 CTF에서 포너블을 풀때 매우 유용하게 쓸 수 있는 툴을 찾아서 설치 방법 및 간단한 세팅 방을 작성해보려고 합니다.
pwninit이란
pwninit 명령어를 문제 바이너리가 있는 디렉토리에서 실행하면 미리 템플릿으로 만들어놓은 익스플로잇 코드를 기반으로 파이썬 파일이 만들어지고 만약 libc 파일이 있다면 해당 파일을 기반으로 ld 파일까지 찾아 patch 까지 해주는 툴입니다.
Install
설치는 해당 레포 Releases 페이지에서 파일을 받은 후 /usr/bin
디렉토리에 직접 삽입해주었습니다.
그리고 아래 코드를 사용하고 있는 셸 설정파일(ex: ~/.zshrc
, ~/.bashrc
)에 입력해주면 됩니다.
1
alias pwninit='pwninit --template-path ~/.config/pwninit-template.py --template-bin-name e'
사용법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ ls
hunter libc.so.6 readme
$ pwninit
bin: ./hunter
libc: ./libc.so.6
setting ./hunter executable
fetching linker
https://launchpad.net/ubuntu/+archive/primary/+files//libc6_2.23-0ubuntu10_i386.deb
unstripping libc
https://launchpad.net/ubuntu/+archive/primary/+files//libc6-dbg_2.23-0ubuntu10_i386.deb
setting ./ld-2.23.so executable
copying ./hunter to ./hunter_patched
running patchelf on ./hunter_patched
writing solve.py stub
$ ls
hunter hunter_patched ld-2.23.so libc.so.6 readme solve.py
위 처럼 해당 디렉토리에서 pwninit
명령어를 사용해주면 만약 libc파일이 있으면 ld 파일을 다운 받아서 patch까지 해줍니다. 만약 바이너리만 있으면 solve.py
라는 파이썬 파일만 만들어 줍니다. 때문에 ~/.config
디렉토리를 만들고 해당 파일을 만들 템플릿 파일을 만들어줘야합니다.
파일 이름은 pwninit-template.py
로 해줘야합니다.
아래는 제가 사용중인 파일입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python3
from pwn import *
{bindings}
context.binary = {bin_name}
r = ROP({bin_name})
lr = ROP(libc)
def conn():
global p
if args.connect:HOST,PORT=args.connect.split(':');p=remote(HOST,int(PORT))
else:p=process([e.path])
if args.debug:context.log_level='debug'
return p
def main():
p = conn()
# good luck pwning :)
p.interactive()
if __name__=='__main__':global args;from argparse import ArgumentParser;parser=ArgumentParser();parser.add_argument('-c','--connect',type=str);parser.add_argument('-d','--debug',action='store_true',default=False);args=parser.parse_args();main()