728x90

ida로 chall3 파일을 연다. main 함수에 접근해서 f5 누르면 Pseudocode가 나온다.

입력을 받아 sub_140001000 함수에 전달한다. sub_140001000 함수 결과에 따라 Correct가 출력된다.

sub_140001000 함수의 Pseudocode도 보자.

24 글자를 비교하는데 byte_140003000[i] 과 (i ^ a1[i])+ 2*i 가 한 글자라도 다르면 0 반환한다. 즉, 모두 일치해야한다.

byte_140003000에 가니 24개의 16진수 값들이 보인다.

a1에 입력한 문자열이 들어가기 때문에 a1 문자열을 찾아야한다.

a1[i] =i ^ (byte_140003000[i] - 2*i)

b=[0x49, 0x60, 0x67, 0x74, 0x63, 0x67, 0x42, 0x66, 0x80, 0x78, 0x69, 0X69,
   0x7b, 0x99, 0x6d, 0x88, 0x68, 0x94, 0x9f, 0x8d, 0x4d, 0xa5, 0x9d, 0x45]
a=[]
for i in range(24):
    a.append(i ^ (b[i] - 2 * i))
    print(chr(a[i]),end="")

실행결과

I_am_X0_xo_Xor_eXcit1ng
728x90

'dreamhack > Reverse Engineering' 카테고리의 다른 글

rev-basic-2  (0) 2023.02.13
rev-basic-1  (0) 2023.02.12
rev-basic-0  (0) 2023.02.12
728x90

우클릭 후 이미지대로 들어가서 correct 문자열 찾는다.

correct 더블클릭한다.

correct를 출력하려면 위에서 chall2.7FF6339D1000에서 실행한 함수의 결과(eax에 저장됨)가 0이 아니어야한다.

call 명령어 부분 더블클릭한다.

jae(jump above or equal) : 크거나 같을 때 점프

movsxd(Move doubleword to quadword with sign-extension) : doubleword를 quadword로 부호 유지한채로 저장

7FF6339D3000에 있는 문자를 하나씩 비교하는 코드다. 17번 비교하는 것을 보니 17글자인가보다.

FLAG가 보인다.

DH{Comp4re_the_arr4y}
728x90

'dreamhack > Reverse Engineering' 카테고리의 다른 글

rev-basic-3  (0) 2023.02.14
rev-basic-1  (0) 2023.02.12
rev-basic-0  (0) 2023.02.12
728x90

rev-basic-0과 동일하게 correct 문자열을 검색하여 찾아간다.

마찬가지로 test eax, eax 연산에서 eax가 0이라면 eax끼리 and 연산 시 0이 반환되므로 ZF 플래그는 1로 세팅되어 바로 아래의 je chall1.7FF6F1E013B6가 실행될 것이다. 그럼 wrong가 출력된다. 따라서 eax는 0이 아니어야 한다. eax는 test eax, eax 어셈블리 코드 바로 위의 call chall11.7FF6F1E01000의 결괏값이 저장되기에 더블 클릭하여 이동한다.

어셈블리 코드는 다음과 같다. 우선 이 코드는 문자열을 앞에서부터 한 글자씩 비교하는 코드이다.

첫 글자 C 비교과정을 보면 rcx의 값이 rsp+8 주소로 이동한다. rcx는 문자열의 주소값일 것이다. rsp+8에는 문자열의 주소값이 계속 위치한다. mov eax,1로 eax에 1이 저장되고 imul rax,rax,0는 rax에 0이 저장된다. imul a, b, n이면 a=b*n 형식으로 실행된다. mov rcx, qword pt ss:[rsp+8] 결과 rsp+8에 있던 문자열의 주소가 rcx에 저장된다. movzx eax, byte ptr ds:[rcx+rax] 결과 문자열 첫 글자가 eax에 저장된다. cmp eax, 43은 eax- 0x43 연산을 하여 결과값이 0이면 ZF를 1로 세팅한다. 만약 같았다면 je chall1.7FF6F1E01023가 실행되어 다음 문자를 비교할 것이다. 만약 다르다면 xor eax, eax 다음 jmp chall1.7FF6F1E0128E가 실행되어 종료하게 된다. 따라서 옆에 한 글자씩 출력되는 문자들이 FLAG가 된다.

DH{Compar3_the_ch4ract3r}
728x90

'dreamhack > Reverse Engineering' 카테고리의 다른 글

rev-basic-3  (0) 2023.02.14
rev-basic-2  (0) 2023.02.13
rev-basic-0  (0) 2023.02.12
728x90
이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.

해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요!

x64dbg로 chall0.exe 파일을 연다.

아래와 같이 검색하여 correct 문자열을 찾는다.

 

첫 번째 칸을 더블클릭하여 찾아가면 correct가 출력되는 어셈블리 코드 부분이 나온다.

Input을 입력받는 것처럼 보인다. test eax, eax는 eax가 0인지 체크하는 코드다. test 연산은 피연산자끼리 and 연산 후 결괏값은 저장하지 않고 플래그 값 세팅하여 je, jne 같은 분기문에 영향을 준다.  eax가 0이면 ZF(zero flag)가 1로 세팅되고 바로 아래의 je chall0.7FFC3231166이 실행된다. chall0.7FFC3231166으로 가면 wrong을 출력하기에 test eax, eax 바로 위의 call chall0.7FF7C3231000에서 eax을 0이 아닌 값으로 세팅해야 한다. call chall0.7FF7C3231000을 더블클릭하면 해당 주소로 이동한다.

test eax,eax 결과 eax가 0이 아니면 jne chall0.7FF7C3231028으로 이동하여 실행하는데 그 결과 eax에 0이 세팅된다. 그렇다면 결국 wrong을 출력할 것이다. 따라서 test eax, eax 결과가 0이 되어야 한다. strcmp함수를 호출하는데 strcmp는 두 문자열이 동일하면 결괏값을 0 반환한다. 0은 eax에 저장되어 반환된다. 두 문자열 중 하나는 7FFC3232220 주소에 위치한 Compar3_the_string이다. rsp+40 주소엔 내가 입력한 문자열의 주소가 저장되어 있을 것이다.

결과적으로 flag는 DH{Compar3_the_string}이다.

728x90

'dreamhack > Reverse Engineering' 카테고리의 다른 글

rev-basic-3  (0) 2023.02.14
rev-basic-2  (0) 2023.02.13
rev-basic-1  (0) 2023.02.12

+ Recent posts