앞의 rev-basic 문제들과 비슷한 유형의 문제이다.
문제 파일을 다운로드 하면 exe파일이 있는 것을 확인할 수 있다.
압축 해제 후 x64dbg로 파일을 열어본다.
문자열 참조를 통해 Correct 문자열을 찾아서 이동한다.
Input값을 받은 뒤에, chall5.7FF7B1611000에서 문자열을 검사하는 것을 알 수 있다.
해당 주소로 이동한다.해당 주소로 이동하면, 위와 같은 코드가 나타난다.
가장 위에 BP를 걸고 프로그램을 실행시킨다.프로그램을 실행시키고, 임의의 값 asdf를 입력한 뒤의 화면이다.
RCX에 Input값이 들어가있는 것을 확인할 수 있다.
이제 F8을 통해 inc 명령어 직전까지 실행시킨다.inc 명령어 전까지 실행시킨 모습이다.
RAX에 Input값의 첫 번째 문자가 들어간것을 확인할 수 있다.
다음으로 add 명령어 전까지 실행시켜본다.add 명령어 전까지 실행시킨 모습이다.
RCX에 Input값의 두 번째 문자가 들어간것을 확인할 수 있다.
다음으로 cmp명령어 전까지 실행시킨다.cmp명령어 전까지 실행시킨 모습이다.
RAX에는 기존 RAX와 RCX값의 합이 저장되어있고,
RCX에는 7FF7B1613000에서 불러운 문자가 저장되어있다.
이를 통해 flag를 검사하는 식은
Input[i] + Input[i+1] = RCX[i] 라는 것을 알 수 있다.
flag를 구하기 위해서 7FF7B1613000에 저장된 문자들을 확인해본다.7FF7B13000에 저장된 문자들이다.
여기서 한가지 특이한 점을 확인할 수 있는데, 문자는 24번 검사하지만,
저장된 문자는 총 23개이다.
이를 통해서 flag의 마지막 문자는 0x4C 인것을 확인할 수 있다.
마지막 부터 차례대로 위에서 구한 식을 대입함으로써 flag를 구할 수 있다.
이런 연산을 진행하는 코드를 c언어로 작성한다.
#include <cstdio>
int main() {
char bb[25];
int num = 0;
int aa[100] = { 0xAD, 0xD8, 0xCB, 0xCB, 0x9D, 0x97,
0xCB, 0xC4, 0x92, 0xA1, 0xD2, 0xD7,
0xD2, 0xD6, 0xA8, 0xA5, 0xDC, 0xC7,
0xAD, 0xA3, 0xA1, 0x98, 0x4C, 0x00 };
for (int i = 23; i >0; i--) {
bb[i] = aa[i - 1] - num;
num = aa[i - 1] - num;
}
for (int i = 1; i < 24; i++) {
printf("%c", bb[i]);
}
}
배열 aa에는 RCX에 들어가는 문자들이 들어간다.
for문을 통하여 문자들을 역순으로 구하고, 그 문자들을 올바른 순서로 출력하는 코드이다.
위 코드를 실행시켜서 flag를 얻을 수 있다.
FLAG : All_l1fe_3nds_w1th_NULL