촉촉한초코칩

[Dreamhack] simple-operation 본문

Study/Reversing

[Dreamhack] simple-operation

햄친구베이컨 2024. 7. 31. 22:57

 

먼저 chall 파일을 실행해보았다. 

rand num이 나오고 Input값이 맞아야..? result로 flag가 출력되는 것 같다. 

 

분석1

IDA로는 안 열려서 우분투 pwndbg로 분석했다. 

gdb ./chall 
disass main

get_rand_num → Random number 출력해주는 부분 같다. 

그 뒤로 scanf, printf하는 함수가 나오고 문자열을 비교하는 함수를 발견했다. 

저 부분에 break를 걸고 실행하면서 어떻게 비교하고 진행되는지 보았다. 

break strcmp 

입력값을 줘야 하는데 주지 않고 실행하니까 잘 안되는 것 같아서 get_rand_num에 break를 걸고 실행했다. 

b *0x00005555555553bb

이번에는 입력값을 주고 난 후 break가 걸리도록 했다. 

입력값으로 abcd를 넣었더니 bcd가 나중에 입력값으로(?) 나왔다. 

→ 그렇다면 입력값은 문자 하나인가? 

 

분석2

이번에는 문자 하나만 넣고 실행해보았다. 입력값 : r

result의 값이 생성..? 되는 것 같다. 

s1은 result로 나온 값이다. 그 값을 s2와 비교한다. 

s2의 값은 실행할 때마다 동일한 값으로 나온다. 그래서 저 값이 들어가는 레지스터에 어떤 값이 들어있는지 보았다. 

x/gx $rdx

594f637..은 또 뭘까.... 

 

결과

결국 또 검색...ㅎ a0b4c1d7과 일치해야 한다는 건 맞는데.. 공격 코드를 짜야 하는 거였다. (나는 IDA로 안 열리는데.. 왜지..)

main 함수 주요 동작

  • random num으로 출력된 값과 사용자 입력값을 xor 연산 
  • 연산 후 16진수 형태 8자리를 9바이트 char 배열 s에 저장 
  • 9바이트 char 배열 s1에 s 문자열을 역순으로 저장 → 이 값이 a0b4c1d7와 일치해야 함 

결국엔 s1(s의 역순 문자열) 값을 s2로 만드는 입력값을 알아내야 한다. 

→ a0b4c1d7을 이용하여 역으로 연산한다. 

#!/usr/bin/env python3
# solv.py

s2_arr = '7d1c4b0a'

input_val = int(s2_arr, 16) ^ rand_num

print(input_val)

먼저 nc로 접속한 후 rand_num 값이 나오면 그 값을 위에 넣어서 출력되는 input_val을 INPUT? 뒤에 넣으면 된다.

 

분석하려고 하다 보니..... 코드를 짜서 저 값이 뭔지 알아내야 한다는 생각을 못했다... 

앞으로는 값이 코드에 안 나와있다면... 함수 분석도 소용 없다면 그 값이 어떻게 연산되는지 알아내고 코드로 만들어보기.. 

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

[Dreamhack] Small Counter  (2) 2024.09.02
[Dreamhack] Secure Mail  (0) 2024.08.15
[Dreamhack] rev-basic-4  (0) 2024.07.27
[Dreamhack] rev-basic-2  (1) 2024.07.22
[Dreamhack] Easy Assembly  (0) 2024.07.07