문제 설명
이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요!
획득한 입력값은 DH{} 포맷에 넣어서 인증해주세요.
예시) 입력 값이 Apple_Banana일 경우 flag는 DH{Apple_Banana}
https://dreamhack.io/wargame/challenges/17
rev-basic-3
Reversing Basic Challenge #3 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출
dreamhack.io
파일 실행
다운로드 받은 파일을 실행해 프로그램이 어떤식으로 동작하는지 확인해 보았다.
문자열을 넣었을 때 Wrong이라는 문자열을 출력한다.
IDA를 통해 해당 프로그램을 분석해 보자
WinMain 함수
함수를 확인해 보니 call로 sub_140001000으로 이동한 뒤 jz로 분기점이 갈리는 것 같다.
따라서 해당 함수로 이동해 보았다.
함수 중에서 눈에 띄었던 부분이다.
xor 함수와 if, for문을 사용해서 무언가 작용을 하는 것을 눈치채어 f5를 이용해서 프로그래밍 코드로 변환하여 보았다.
들어온 문자열을 열심히 연산하여 저장된 문자열과 같은지 확인한다.
저장되어 비교하는 문자열이 무엇인지를 구하면 될 것 같다.
저장된 값은
0x49 0x60 0x67 0x74 0x63 0x67 0x42 0x66 0x80 0x78 0x69
0x7B 0x99 0x6D 0x88 0x68 0x94 0x9F 0x8D 0x4D 0xA5 0x9D 0x45
이다.
이제 위의 프로그램을 역연산하면 된다.
#include <stdio.h>
void reverseCalculation(unsigned char *chars) {
char ch;
for (int i = 0; i < 0x18; ++i) {
ch = (chars[i] - 2 * i) ^ i;
printf("%c", ch);
}
}
int main() {
unsigned char chars[] = {0x49, 0x60, 0x67, 0x74, 0x63, 0x67, 0x42, 0x66, 0x80, 0x78,
0x69, 0x69, 0x7B, 0x99, 0x6D, 0x88, 0x68, 0x94, 0x9F, 0x8D, 0x4D, 0xA5, 0x9D, 0x45, 0x00};
reverseCalculation(chars);
return 0;
}
역연산을 위한 코드이다.
아까 발견했던 문자열을 역으로 계산하여 출력하는 간단한 코드이다.
해당 프로그램을 돌린 결과이다.
플래그가 맞는지 인증해보자.
클리어
예전에 비슷한 문제를 풀어본 적이 있어서 그런지 별로 어렵지 않았다.