본문 바로가기

WARGAME/smch ctf

SMCH CTF - BOF4

 

 

이번에는 BOF4번 문제당 바로 실행시켜 보자

 

 

 

 

문자열을 입력받는닷 이번에도 아무거나 입력해보장

 

 

 

 

입력을 주었더니 내가 입력 넣은 문자열과 "No flag... So sad (T.T)"라는 문자열이 출력된다. 바로 IDA로 분석 ㄱㄱ 해보자

 

 

 

 

main함수의 구조는 다음과 같다 buf를 0x4C만큼 할당하고 memset함수로 버퍼를 초기화 한 다음 v4 함수 포인터 변수에다가 no_flag

의 함수 주소를 넣고, 처음 실행했을 때 봤던 문자열들을 출력한 다음 read함수로 입력을 받는다. 그 다음 if 문을 거친 다음 내가 입력한 문자열을 출력 후 함수 포인터 v4를 통해 no_flag 함수를 호출하고 있다. 솔직히 v5에다가 argc의 주소 값 넣는 거랑 if 문에서 buf [ len-1 ] == 10 조건이 참이면

buf[ len - 1 ] = 0으로 초기화하는 이유는 잘 모르겠지만 문제를 해결하는 데는 큰 영향을 미치는 거 같지는 않다.

 

그럼 이제 v4를 통해 호출하는 no_flag 함수의 구조를 보자

 

 

 

 

no_flag 함수의 구조는 간단했다. 단순히 "NO flag... So sad (T.T)"라는 문자열을 출력해주고 끝난다. 즉슨 우리가 입력을 받고 난 뒤 v4(no_flag) 함수를 호출하게 되니 당연히 flag를 얻을 수가 없다. 그렇담 다른 함수들을 분석해보면 flag를 얻을 수 있는 system함수가 있을 것이다. gdb의 i fu 명령어로 바이너리 내부 함수 목록들을 봐 보면,

 

 

 

 

get_flag라는 함수가 있는 것을 확인할 수 있다 되게 이름만 봐도 flag를 줄 거 같이 생긴 함수인데 한번 함수 구조를 분석해 보장

 

 

 

 

역시 system함수로 flag를 보여준다 .

 

즉슨 우리는 이 v4 함수 포인터 변수가 가리키는 함수의 주소 값을 no_flag 함수의 주소 값이 아닌 get_flag 함수의 주소 값으로 덮어주면 된다

 

자, 그럼 v4변수의 buf내부에서의 위치를 계산해보면, 전체 버퍼 크기 ebp-0x4 C(76)에서 v4의 위치 ebp-0xC(12) 뺀 값 64만큼 버퍼를 채우고 그 뒤에가 v4변수의 영역이니깐  get_flag함수의 주소를 넣으면 v4 함수 포인터가 가리키는 함수가 get_flag로 덮어 쓰여저 결국은

no_flag가 아닌 get_flag함수를 실행시키게 될 것이다

 

1
2
3
4
5
6
7
8
9
10
11
from pwn import*
 
p=remote("ssh.luxroot.com"9005)
 
payload=''
payload+='A'*64
payload+=p32(0x804854b)
 
p.sendline(payload)
 
p.interactive()

 

익스를 다음과 같이 짜 보고 실행을 해보면,

 

 

 

get_flag 함수가 실행되어 flag를 쓱 딸 수 있다.

 

 

FLAG : flag {W0W_U_Kn0w_ab0 ut_Function_p0 inter!_Kakaotalk_to_shinmg2520}

'WARGAME > smch ctf' 카테고리의 다른 글

SMCH CTF - Calc  (0) 2019.11.09
SMCH CTF - Rock Paper scissors(EZ)  (0) 2019.11.08
SHCH CTF - BOF3  (0) 2019.11.03
SMCH CTF - BOF2 (EZ)  (0) 2019.11.03
SMCH CTF - BOF1 (EZ)  (0) 2019.11.01