문제 설명
end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면 어느 문자열이 나오는가?
문제 풀이
라인별 코드 분석
- 1번째 라인 : dl에 rsi + rcs(예: 0x400000 + 0) 값 넣기
- 2번째 라인 : dl을 0x30과 xor 연산
- 3번째 라인 : rsi + rcs에 dl 값 넣기
- 4번째 라인 : rcx 값 1 증가
- 5번째 라인 : rcx와 0x19 비교 연산
- 6번째 라인 : rcx가 0x19보다 크면 종료
- 7번째 라인 : rcx가 0x19보다 작거나 같으면 1번째 라인으로 돌아가기
-> 결국 18번 동안 반복문을 돌며 기존 메모리에 있는 값과 0x30을 가지고 xor 연산을 수행하는 코드로 볼 수 있음
어셈블리어를 C 코드로 변환
#include <stdio.h>
int main() {
char memory[32] = {
0x67, 0x55, 0x5C, 0x53, 0x5F, 0x5D, 0x55, 0x10,
0x44, 0x5F, 0x10, 0x51, 0x43, 0x43, 0x55, 0x5D,
0x52, 0x5C, 0x49, 0x10, 0x47, 0x5F, 0x42, 0x5C,
0x54, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
int rcx = 0;
char dl;
while (rcx < 0x19) {
dl = memory[rcx];
dl ^= 0x30;
memory[rcx] = dl;
rcx++;
}
for (int i = 0; i < 0x19; i++) {
printf("%c", memory[i]);
}
printf("\n");
return 0;
}
실행 결과
정답 문자열 : Welcome to assembly world
'Security > Reverse Engineering' 카테고리의 다른 글
rev-basic-3 풀이(IDA) (0) | 2025.02.20 |
---|---|
rev-basic-3 풀이 (0) | 2025.02.05 |
abex-crackme#2 풀이 (0) | 2025.02.04 |
rev-basic-2 풀이 (0) | 2025.01.22 |
rev-basic-1 풀이 (0) | 2025.01.22 |