[Reversing.kr] Replace

#REVERSING

Reversing.kr의 Replace 문제풀이


Reversing.krReplace문제인데 상당히 재밌었다.

Wrong

처음 Input 값을 넣고 Check 버튼을 누르면 0x40466F 명령어에서 오류가 발생한다.

0x40466F의 명령어는 다음과 같다.

0040466F    | C600 90   | mov byte ptr ds:[eax],90

[eax]90(NOP) 을 넣는건데 오류가 발생한다. IDA에 뜬 오류를 보면 다음과 같다.

The instruction at 0x40466F referenced memory at 0x6017E6BE. The memory could not be written.

0x40466F에는 0x6017E6BE이 들어있는데 이곳은 수정이 불가능하다는 것이다.


여기까지 확인하고 IDA의 그래프를 보니깐 딱 보니 아래 빨간 박스 부분으로 들어가야되는데 들어가는 선이 보이지 않는다. graph 어떻게 저 구간으로 들어가라는 것인가.


사용자의 입력 값을 가져오는 GetDlgItemInt에 아래와 같이 중단점을 걸고 한줄씩 트레이싱 해보면 먼저 [4084D0] 에 내가 넣은 Input 값을 16진수로 넣는다.

bp [4084D0]INC하는 부분이 몇 번 나온다. 그리고 아래로 더 내려가면 inc

아래와 같은 부분이 나오는데 [4084D0] += 0x601605C7 하는 부분이다. 404674 그리고 계속 트레이싱하면 4046A9

오류를 발생했던 부분이 나오는데 해당 함수에 중단점을 걸고 [eax] 값을 확인하면

[eax] = (input 값 + 4 + 0x601605C7)

라는 사실을 알 수 있다.

40466F의 명령어는 [eax] 의 값을 90(NOP) 으로 바꾸는 역할이다. 우리는 정답을 위해서 0x401073으로 가야되는데 0x401071에 있는 JMP문으로 인해 0x401073으로 못갔다.

즉,

정답은 0x40466F의 명령어를 이용해서 0x4010710x401072의 두 부분을 NOP으로 만들고 0x401073(Correct 부분) 으로 들어가는 것이다.

따라서 0x401071 = input 값 + 4 + 0x601605C7에 해당하는 input 값의 10진수 표현이 정답이고

그 값은 계산기를 돌리면 쉽게 나오는데 2687109798이다.

correct