쉬운 난이도의 리버싱 문제
원격으로 접속할 수 있는 주소와
Lao-Tzu 라는 이름의 바이너리 파일이 제공된다.
참고로 Lao-Tzu 는 춘추시대 철학자인 노자를 말한다.
Lao-Tzu 파일을 리눅스 환경에서 실행시켜 보았다.
Enter the secret for the magic word : 라면서 사용자의 입력을 기다린다.
123 이라고 입력해봤는데 magic word 가 아닌지 바로 프로그램이 종료되었다.
바로 IDA를 이용해 바이너리를 열어서 main 함수를 살펴보았다.
Enter the secret for the magic word : 라는 문구가 출력된 후에,
scanf 로 사용자 입력을 받아 v9 변수에 저장한다.
그다음 magic_word 함수에 v9를 인수로 집어넣고, 그 결과를 v4에 저장한다.
그리고 strcpy 함수를 써서 dest에 v4의 값을 저장하고 있다.
우선 magic_word 가 뭐하는 함수인지 살펴봐야 겠다.
magic_word 는 사용자가 입력한 값의 각 글자를 비교하여 올바른 값이 들어왔는지 검증하는 것이다.
만약 검증에 실패한다면 nopassyo 라는 문구를 return 하게 된다.
이런건 표로 만들어서 구하면 쉽다.
단순 비교를 하고 있는 a[3], a[6], a[7] 같은 값들을 먼저 채워넣고,
계산을 해서 구해야 하는 a[0], a[1] 등은 차례로 계산해서 넣어주면 된다.
비교하고 있는 숫자는 ASCII 코드 값으로 ASCII 코드표를 보고 숫자에 해당하는 문자열을 채워준다.
그럼 t0m7r00z 라는 단어가 나오는것을 볼 수 있다.
다시한번 Lao-Tzu 를 실행시켜
magic word 를 물어보면 t0m7r00z 라고 입력해본다.
그럼 아까와 다르게 Enter the thing that's in my mind: 라는 문구가 출력되면서
사용자 입력을 기다린다.
다시한번 IDA에서 main 함수를 살펴본다.
이번엔 Strcmp 함수와 strcmp 함수의 조건문을 통과해야 한다.
통과하면 flag.txt 파일을 읽을 수 있다.
strcmp 함수는 일반적으로 생각하는 문자열 비교 함수가 맞다.
아까 dest에 들어간 t0m7r00z 라는 값이 사용자 입력값(s)과 동일한지 확인하는 것이다.
문제는 Strcmp 함수이다.
Strcmp 함수는 사용자가 입력한 값의 10번째 까지 더했을때 660이 나오는지 확인하고 있다.
그런데 계산해보면 이미 8번째 글자까지 더했을때 660이 나온다.
하지만 10글자를 어쨌든 채워줘야 하기 때문에 뒤에 0x00(NULL) 을 붙여주었고,
마지막 글자는 아무거나 집어넣어 보았다.
from pwn import *
p = process('./Lao-Tzu')
p.sendlineafter("Enter the secret for the magic word: ","t0m7r00z")
s = b"t0m7r00z\x00\xaa"
p.sendlineafter("Enter the thing that's in my mind: ",s)
p.interactive()
Python의 pwntool 을 이용해 이렇게 간단하게 작성이 가능하다.
sendlineatfer 를 이용해서 magic word 가 올때는 t0m7r00z 를
in my mind 가 올때는 tom7r00z\x00\xaa 를 전송하게끔 만들었다.
0xaa 는 null 값이 아닌 다른 아무값으로 바꿔도 무방하다.
코드를 실행시키면 플래그를 찾을 수 있다.
'CTF > 리버싱' 카테고리의 다른 글
[JISCTF] REV102 - 리버싱 / Uncompyle6 (60) | 2023.01.22 |
---|---|
[JISCTF] Baby Reverse - 리버싱 / IDA (67) | 2023.01.17 |
[2020CCE] Easyransom - 리버싱 / IDA / HxD / XOR (42) | 2022.11.04 |
[2020CCE] My Friend - 리버싱 / IDA / Python (56) | 2022.11.01 |
[2020CCE] Simple Botnet - 리버싱 / IDA (60) | 2022.10.11 |