Self-Improvement

[CODEGATE] BabyMISC (32bit) 풀이 및 Pwntools 본문

리버싱 기초/CODEGATE

[CODEGATE] BabyMISC (32bit) 풀이 및 Pwntools

JoGeun 2020. 6. 8. 13:20

BabyMISC
0.01MB

 

이번 문제는 base64에 대한 것을 공부하게 되는 계기가 되었다.

 

FILE

ELF 64bit, Dynamically linked, stripped

 

실행

BabyMISC을 실행하게 되면 STAGE 01이 뜨면서 입력값을 받음으로 hello?을 했더니 종료가 되어진다.

 

IDA

Main을 확인해 보니 간단하게 3가지의 스테이지가 있는것처럼 보인다.

 

sub_400EA8(STAGE 01)

분석하는 과정에서 name을 재정의를 몇몇 하였다.

return 과정에서 True 참이 되면 다음 STAGE로 넘어갈 수 있다.

1. 입력 값과 기존 base64의 길이가 같아야 한다.

2. base64로 decode할 시 값이 같아야 한다.

3. 입력 값은 달라야 한다.

base64에 대해 알아야 풀 수 있으며 아래의 링크에서 도움을 얻었다.

https://bbolmin.tistory.com/46

즉 "TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5Oig="와 길이와 decode할 시 동일해야 하며 값은 다른 것을 찾아야 한다.

"TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5Oih=" 로 가능하다.

 

sub_401005(STAGE 02)

여기서는 입력 값을 2번 받고 있으며 입력 값을 base64로 decode하여 return의 조건에 맞춰서 반환하게 된다.

return을 보게 되면

1. 입력 값 2개의 길이가 달라야 한다.

2. 입렵 값 2개를 base64로 decode할 시 같아야 한다.

 

Base64에서 "="는 패딩을 뜻하는 것으로 

a=, a==는 같은 값을 나타내고 있다.

 

sub_401142(STAGE 03)

입력 값을 하나 받은 후 "if ( regcomp(&preg, "[/|$|-|_|&|>|`|'|\"|%|;]|(cat)|(flag)|(bin)|(sh)|(bash)", 1) )"에서 문자 필터링이 존재하여 해당 문자들은 사용하지 못한다.

필터링을 벗어 나서는 system()함수가 실행이 되며 종료 된다.

입력 값은 base64로 주어야 한다.

 

내 서버 환경으로 그냥 id(aWQ=)라는 입력 값을 주었다.

정상적으로 system()함수가 실행 되었다.

 

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pwn import *
 
p=process('./BabyMISC')
 
p.recvuntil("Input >")
p.sendline("TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5Oih=")
 
p.recvuntil("Input 1")
p.sendline("a=")
 
p.recvuntil("Input 2")
p.sendline("a==")
 
p.recvuntil("Input >")
 
p.sendline("aWQ=")
p.recv()
p.interactive()
cs