목록WarGame (3)
보안 / AI / 프로그래밍
Debugger는 x96dbg 프로그램을 사용했습니다. 먼저 Debugger로 프로그램을 실행시켜 반응을 살펴봅시다. Debugger로 "Input :" 문자열을 참조하는 장소로 가서 적절한 곳에 BP를 걸어줍니다. 이번에도 마찬가지로 eax가 0이 아니면 됩니다. 그위에 위치한 call 함수를 따라 가보았습니다. 함수를 살펴봅시다. 1) jmp chall2.7FF635E2101A ... 2) movsxd rax dword ptr ss:[rsp] 3) cmp rax, 12 4) jae chall2.7FF635E21048 1) 먼저 Jmp 를 타고 아래 코드로 향합니다. 2) movsxd 를 통해서 rsp 메모리에 들어있는 값을 DWORD 형으로 rax에 저장합니다. (movsxd에 대해서는 아래 참조 자..
Debugger는 x96dbg 프로그램을 사용했습니다. 먼저 Debugger로 프로그램을 실행해 봤습니다. 그리고 아무 글자나 입력하고, 반응을 살펴보았습니다. 저번 문제와 동일하게 Wrong 이라는 문자열을 반환하네요. 이번에도 저번 문제와 동일하게 Input을 받는 지점을 살펴보겠습니다. 이번에도 프로그램 흐름이 Correct를 향해야 한다는 느낌이 오시나요? 이번에도 Correct로 흐름이 유지되려면 test eax, eax와 je ... 에서 알 수 있듯이, eax는 0이 되서는 안됩니다. 그러면 test 코드 위에 있는 call을 따라 들어가 보겠습니다. 이번에는 뭔가 같은 코드들이 반복된다는 느낌이 오는데요. 코드를 잘 보시면 rax를 계속 증가시키면서 movzx eax, byte btre d..
Debugger 는 x96dbg 프로그램을 사용했습니다. 먼저 Debugger 로 프로그램을 실행해 봤습니다. 일단 저 "Input :" 문자열이 입력되는 곳, 입력한 "aaaaaaaaaaaaa"이 저장된 곳 위주로 찾았습니다. 그 주변에서 입력받은 문자열이 맞는지 아닌지 대조하는 조건분기점이 있을 것이라고 예상했기 때문입니다. 첫번째 BP(BreakPoint)는 문자열을 출력하는 함수입니다. 보통 call을 할 때, call 하는 함수의 필요한 인자들을 레지스터에 담아두고 call을 부릅니다. 자세히 보시면 rcx 레지스터에 "Input :" 문자열을 가진 메모리 주소를 담는 것을 볼 수 있습니다. 세번째 BP를 보시면 eax가 0인지 아닌지 검사하고 있습니다. 만약 0이면 wrong을 , 아니면 Co..