lhywk 님의 블로그

[Dreamhack] rev-basic-3 본문

Reversing/Dreamhack

[Dreamhack] rev-basic-3

lhywk 2025. 12. 13. 11:24

문제

이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.

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

문제 풀이

먼저 exe 파일을 실행해볼게요.

exe 실행

실행해보면 input에 값을 받고 조건을 검사하고 Wrong을 출력하네요.

이걸 correct가 뜨게 만드는 입력값을 찾는게 문제에요.

main 디컴파일

main을 바로 디컴파일 해볼게요.

char형 배열 v4에 256개의 원소가 들어갈수있는 배열이 있고

memset으로 0으로 초기화하네요.

그 다음 v4에 입력값을 받고 sub_140001000에 인자로 주고 반환값이 True라면 Correct를 출력해줘요.

sub_140001000 디컴파일

그럼 이제 조건문의 함수인 sub_140001000을 디컴파일 해볼게요.

for문을 24회 반복하면서 if문을 체크해요.

그런데 반복문안에 if문이 조건에 맞으면 return 0;이기 때문에 항상 조건이 성립하지 않아야 해요.

byte_140003000 배열

해당 배열을 확인해보면 49h~ dup(0)의 값을 가지고 있네요.

Hex view

Hex view로 정렬되게 확인할수 있어요.

Export data

Shift+E를 눌러 Export data를 해서 해당 값을 편하게 복사 붙여넣기 할게요.

단축키가 설정이 안되어있다면 Options -> Shortcuts 에서 Export data 단축키를 설정해주세요.

data = bytearray([0x49, 0x60, 0x67, 0x74, 0x63, 0x67, 0x42, 0x66, 0x80, 0x78, 0x69, 0x69, 0x7B, 0x99, 0x6D, 0x88, 0x68, 0x94, 0x9F, 0x8D, 0x4D, 0xA5, 0x9D, 0x45])

for i in range(24):
    tmp = data[i] - 2 * i
    tmp = tmp % 256
    
    tmp = tmp ^ i
    print(chr(tmp), end='')

플래그를 찾기 위해 역연산을 진행해볼게요.

24바이트의 입력값이 a1일때 (i ^ *(unsigned __int8 *)(a1 + i)) + 2 * i)의 결과가 익스포트한 값과 일치해야 합니다.

*(unsigned __int8 *)(a1 + i)은 a1[i]으로 해석이 되고 양변에서 2 * i를 빼주고 i로 XOR 연산을 해주면 역연산이 마무리 되요.

해당 코드는 이 로직을 구현한 파이썬 코드에요.

플래그 획득

역연산이 알맞게 됐다면 플래그를 획득합니다.

'Reversing > Dreamhack' 카테고리의 다른 글

[Dreamhack] rev-basic-4  (1) 2025.12.16
[Dreamhack] WinDbg Exercise 2  (0) 2025.12.15
[Dreamhack] WinDbg Exercise 1  (0) 2025.12.15
[Dreamhack] patch  (1) 2025.12.13
[Dreamhack] randzzz  (0) 2025.11.21