dreamhack.io의 Wargame rev-basic-7 문제이다.
https://dreamhack.io/wargame/challenges/21/
rev-basic-7
Reversing Basic Challenge #7 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출
dreamhack.io
#문제분석
이번 문제도 단순한 입력값 검증 문제다.
#문제풀이
[main]
해당 부분이 메인함수 영역이며, 딱히 특별한 부분은 없다. 문자열 하나를 받아온다 정도...? 아무튼 test eax, eax 이후의 분기에서 "Correct"와 "Wrong"이 출력되니까 그 위에 있는 <chall.sub_7FF6DFE01000>을 확인해보자.
[chall.sub_7FF6DFE01000]
뭐 그렇게 어렵지는 않다. 전체적인 흐름을 보자면...
1. 입력값에 대해 rol연산을 진행한다.
2. 입력값이 맞으면, 점프해서 correct로 간다.
3. rol연산의 반복은 0x1F만큼한다.
연산부분을 자세히 살펴보자.
mov eax, dword ptr ss:[rsp]
and eax, 7
[rsp]에는 index로 사용하는 값이 들어가 있고 이를 eax로 넘겨준다. eax를 7과 and 연산을 진행한다.
movsxd rcx, dword ptr ss:[rsp]
mov qword ptr ss:[rsp+8], rcx
mov rdx, qword ptr ss:[rsp+20]
movzx ecx, al
mov rax, qword ptr ss:[rsp+8]
movzx eax, byte ptr ds:[rdx+rax]
rol al, cl
ecx에는 인덱스가, eax에는 입력값[i]가 들어가게 된다. 이후 하위 1byte에 대해 rol 연산을 진행하게 되는데...
입력값[i] << (i & 7) 이라고 보면 된다...!
movzx eax, al
xor eax, dword ptr ss:[rsp]
movsxd rcx, dword ptr ss:[rsp]
lea rdx, qword ptr ss:[7FF6DFE03000]
movzx ecx, byte ptr ds:[rdx+rcx]
cmp eax, ecx
이후 rol 연산한 결과 값을 인덱스와 xor연산을 진행한다. 비교할 key 값을 rdx에 저장하고 해당 인덱스에 위치한 값을 ecx에 저장한다. 그리고 eax와 ecx가 맞는지 확인!
이를 정리하면...
{입력값[i] << (i & 7)} ^ i == 비교 key값[i] 이니까... 이를 역연산 해주면 되겠습니다~
#include <stdio.h>
int ror(int x, int n) {
int shift = x >> n;
int src = x << (8-n);
src &= 255;
return shift | src;
}
int main(){
int key[] = {0x52, 0xDF, 0xB3, 0x60, 0xF1, 0x8B, 0x1C, 0xB5, 0x57, 0xD1, 0x9F, 0x38, 0x4B, 0x29, 0xD9, 0x26, 0x7F, 0xC9, 0xA3, 0xE9, 0x53, 0x18, 0x4F, 0xB8, 0x6A, 0xCB, 0x87, 0x58, 0x5B, 0x39, 0x1E};
int i, j, flag;
for(i=0; i<0x1F; i++){
key[i] = key[i] ^ i;
j = i&7;
flag = ror(key[i], j);
printf("%c", flag);
}
}
여기서 중요한 건 rol과 ror의 코드 작성법인데... 사실 조금만 생각해보면 금방 할 수 있다. 아무튼 실행해주면...
Roll_the_left!_Roll_the_right!
쨘! 쉽게 flag 획득~
'Write-up > dreamhack.io' 카테고리의 다른 글
[Dreamhack.io] patch (0) | 2022.11.09 |
---|---|
[Dreamhack.io] Secure Mail (1) | 2022.11.02 |
[Dreamhack.io] rev-basic-8 (0) | 2022.08.31 |
[Dreamhack.io] Inject ME!!! (1) | 2022.08.30 |
[Dreamhack.io] rev-basic-1 (0) | 2022.08.30 |