
두번째 200점짜리 문제
[사전조사]

시 내용과 저자를 입력받아서 정확히 백만점을 획득하라고 한다. 단순히 길게 입력한다고 점수를 주는것같지는 않다.

쉘코드는 삽입할 수 없다.
[코드 분석]

전체적으로 봤을때는 reward로 가면 될것같다.
그러기 위해서는 dword_6024e0에 있는 값이 0xf4240(=백만)과 같아야 할것같다.

dword_6024e0은 여기에 있고 bss 영역이라 aslr을 걱정할 필요가 없다.

쭉 위로 올려보면 poem이라는 변수명이 보인다. 버퍼 오버플로우와 관련이 있을것같다.
get_poem, get_author, rate_poem 함수들을 더 살펴보자

첫번째로 호출되는 get_poem 함수다. gets를 중심으로 보면 poem부터 입력받기 시작한다. gets로 입력받아서 입력 길이 제한은 없지만 문제는.. 아까 비교대상으로 언급했었던 dword_6024E0가 문자 입력 후 0으로 바뀌어버린다..

두번째로 호출되는 함수는 첫번째 함수랑 동작이 거의 비슷하다. gets의 인자로 unk_6024a0이라는게 전달되는데..

poem이랑 주소가 똑같다. 즉, get_poem이랑 거의 비슷한 역할을 하는것이다. 그리고 여기에는 dword_6024E0를 초기화하는게 없다. 여기에서 버퍼 오버플로우를 일으키면 될것같다.(아직 rate_poem을 안보고 섣부른 판단을 한건가..)

rate_poem함수다. 차근차근 분석이 필요할것같다.

poem에 있는 문자들을 dest로 복사하고 dest에서 개행 문자 또는 공백 단위로 잘라준다.
strtok를 한번 수행했기때문에 rax에는 문자의 처음 시작주소가 담겨있고, 개행 문자가 있는곳은 널문자로으로 바뀌는데
이 처음 시작 주소가 s1에 담겨진다.
s1 = poem 시작주소

아무것도 입력을 안했으면 첫 문자가 개행문자이고, 이 개행문자가 널문자로 바뀌게 되어 빨간색 화살표로 따라가게 될것이지만, 문자를 한글자라도 입력했으면 초록색 화살표로 간다.
똑같은 구조가 반복되기 때문에 하나만 해석해보자
strcmp를 수행하는데 아까 strtok를 통해 개행문자를 없앤 문자열과 espr, eat, sleep등의 문자열을 하나하나 비교한다. 하나라도 일치하면

dword_6024E0에 있는 값을 100만큼 더해준다.
그리고 처음에 했던 것처럼 공백문자 또는 개행문자를 기준으로 문자열이 끝날때까지 계속 단어를 나눈다.
[풀이 전략]
버퍼 오버플로우를 이용해서 한번 만 단어를 만들어보고자 했지만.. 4만글자가 필요하기때문에(현재 있는 공간은 약 천글자정도) 다른 방법을 선택해야했다.
그러면 그냥 점수가 들어있는 영역을 버퍼 오버플로우로 덮어쓰면 되지 않을까?
입력 시작 부분인 0x6024A0부터 dword_602424E0까지 거리는 64이고, 이 64 바이트를 아무 문자로 채운 다음 백만이라는 숫자를 덮어쓴다면 될것 같았다. 단, 시 내용을 입력받는 부분에서는 입력을 받은 후 점수가 0으로 초기화되기 때문에 작가를 입력받는 부분에서 버퍼 오버플로우를 발생시켜야한다.
[실행해보기]
실행으로 옮겨보자
from pwn import *
p = remote('ctf.j0n9hyun.xyz', '3012')
#p = process('./poet')
p.recvuntil('> ')
p.sendline(' ')
p.recvuntil('> ')
data = b'A'*64
data += p64(1000000)
p.sendline(data)


[마무리]
급할수록 돌아가라는말이 이럴 때 어울리는것같다. 돌아가지 않았더라면 지금까지도 만 단어를 채우기 위해 4만 글자를 집어넣을 방법을 계속 생각하고 있었을 것이다..
'정보보안' 카테고리의 다른 글
| [문제해결] Reversing.kr Easy Keygen 해결과정 (0) | 2022.02.01 |
|---|---|
| [문제해결] HackCTF RandomKey 해결과정 (0) | 2022.01.28 |
| [문제해결] HackCTF RTL_World 해결과정 (0) | 2022.01.22 |
| [문제해결] HackCTF yes or no 해결과정 (0) | 2022.01.21 |
| [정보보안] Return to Libc 씹어먹기 (0) | 2022.01.20 |