본문 바로가기

Reversing/DreamHack

[DreamHack_Wargame] rev_basic_7번

문제 : 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요.

 

< main 함수 >

이번 문제도 메인함수는 다른 문제들과 똑같다.

위의 회색 줄에 있는 함수 내부에서 입력받은 값과 정답을 비교하는 것을 알 수 있고, eax 값이 0이 아니어야 한다는 것을 알 수 있다.

 

< 7FF7D8BF1000 >

위의 main 함수에서 eax 값이 0이 되면 안된다고 했으므로,

위의 그림에서 6번 블록으로 진행하면 안된다는 것을 알 수 있다.

이에 따라 함수 진행 방향은 1 -> 2번으로 진행했다가, 4 -> 5-> 7-> 2 가 반복하다가, 마지막에 2 ->3 -> 8으로 진행해서 함수를 빠져나가는 것을 알 수 있다.

 

< 1번 블록 >

1.       | mov qword ptr ss:[rsp+8],rcx            |

            : [rsp+8] = rcx = input

2.       | sub rsp,18                              |

            : 스택 증가 ( 스택 증가로 [rsp+20] = rcx = input )

3.       | mov dword ptr ss:[rsp],0                |

            : [rsp] = 0

4.       | jmp chall7.7FF7D8BF101A                 |

 

 

< 2번 블록 >

1.       | movsxd rax,dword ptr ss:[rsp]           |

            : rax = [rsp] = index

2.       | cmp rax,1F                              |

3.       | jae chall7.7FF7D8BF1065                 |

            : rax >= 0x1F면 3번 블록으로 점프, rax < 1F이면 4번 블록으로 진행

 

< 4번 블록 >

1.       | mov eax,dword ptr ss:[rsp]              |

            : eax = [rsp] = index

2.       | and eax,7                               |

            : eax = eax & 0x7 = index & 0x7

3.       | movsxd rcx,dword ptr ss:[rsp]           |

            : rcx = [rsp] = index

4.       | mov qword ptr ss:[rsp+8],rcx            |

            : [rsp+8] = rcx = index

5.       | mov rdx,qword ptr ss:[rsp+20]           |

            : rdx = [rsp+20] = input

6.       | movzx ecx,al                            |

            : ecx = eax의 하위 비트 (eax = index & 0x7 )

7.       | mov rax,qword ptr ss:[rsp+8]            |

            : rax = [rsp+8] = index

8.       | movzx eax,byte ptr ds:[rdx+rax]         |

            : eax = [rdx+rax] = input[index]

9.       | rol al,cl                               |

            : al = al을 cl 만큼 왼쪽으로 밀기 (al = input[index] << (index & 0x7))

10.   | movzx eax,al                            |

            : eax = al

11.   | xor eax,dword ptr ss:[rsp]              |

            : eax = eax ^ [rsp] = (input[index] << (index & 0x7)) ^ index

12.   | movsxd rcx,dword ptr ss:[rsp]           |

            : rcx = [rsp] = index

13.   | lea rdx,qword ptr ds:[7FF7D8BF3000]     |

            : rdx에 [7FF7D8BF3000] 주소 값 저장

14.   | movzx ecx,byte ptr ds:[rdx+rcx]         |

            : ecx = [rdx + rcx] = [7FF7D8BF3000][index]

15.   | cmp eax,ecx                             |

            : (input[index] << (index & 0x7)) ^ index 와 [7FF7D8BF3000][index] 비교

16.   | je chall7.7FF7D8BF1063                  |

 

 

< [7FF7D8BF3000] >

rdx에 저장된 해당 주소로 따라가면 위의 그림과 같은 값들이 저장되어 있다.

 

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

 

 

< 코드 작성 >

 

< 문제 인증 >