본문 바로가기

분류 전체보기34

dreamhack : rev-basic-6 문제 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출력하는 입력값을 알아내세요. 풀이과정 분석함수인 7FF ~ 1000 으로 들어가서 6번은 어떤 코드를 작성해야 하는 문제인지 알아보도록 한다. ret까지의 코드들의 큰 흐름을 살펴보니, 7FF~3020 주소에 저장된 문자열을 str, 7FF~3000 주소에 저장된 문자열을 buff라고 하고 사용자가 입력하는 문자열을 input이라고 한다면 str의 input[i]번째 문자 = buff의 i번째 문자가 되도록 하는 input값을 찾아내야 하는 것 같다. 그니까 내가 입력한 input이라는 문자열의 i번째 문자가 특정한 값.. 2023. 11. 5.
dreamhack : rev_basic_7 문제 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출력하는 입력값을 알아내세요. 풀이과정 전의 문제들과 같이, wrong이 저장된 코드로 들어가서 분석함수에 진입한다. 10DE 주소에 정의된 7FF ~ 1000 함수 들어가기 옆에 주석을 달아놨다~ 결국 함수의 전체 흐름을 살펴보면, (입력값의 i번째 문자를 i&7만큼 rol한 값) ^ i 의 값이 (버퍼에 미리 저장된 str 문자열의 i번째 값) 인 입력값을 찾아내면 되는 것이다. 이때 A ^ B = C 에서 xor 연산자의 특성을 이용하면 B ^ C = A, A ^C = B 이므로 => (입력값의 i번째 문자를 i&7.. 2023. 11. 4.
dreamhack : rev_basic_3 문자열찾기부터 ㄱㄱ 1173 함수에서 test eax, eax에서 eax == 0이면 je -> Wrong이 출력되기 때문에 eax != 0 이어야 한다. 따라서 eax 값을 반환해주는 116E 함수를 분석해보기로 한다. 어 뭐지 이번에 처음 푸는 건데? 내가 달았나? 아니다. 문제 만드신 분께서 해설지 느낌으로 주석을 달아주셨나보다. 주석 다 달려 있기는 한데 그래도 해석은 해야지... 1000 : 메인 함수에서 rcx에 사용자 입력값을 넣어 왔었다. 따라서 rcx에 저장된 사용자 입력값을 rsp+8 주소에 저장한다. 1005 : 스택을 18만큼 확장 => 따라서 rsp+20 주소에 사용자 입력값이 저장된다. 1009 : rsp 주소에 0을 저장한다. 1010 : jmp 명령어는 무조건 수행해야 한다... 2023. 8. 6.