e_yejun
Jun_ : Pwn
e_yejun
전체 방문자
오늘
어제
  • 분류 전체보기 (240)
    • Profile (1)
    • Pwnable (54)
    • Reversing (14)
    • Network (8)
    • Forensic (10)
    • Embedded (4)
    • Android (2)
    • Web (18)
    • 알고리즘 (42)
    • 프로그래밍 (24)
    • 프로젝트 (6)
    • 1-day (7)
    • CTF (15)
    • 기타 (33)
    • 일기장 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • how2heap
  • rev-basic
  • Heap
  • 1-day
  • x64
  • wargame
  • dreamhack.io
  • dvwa
  • X86
  • BOF

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
e_yejun

Jun_ : Pwn

Reversing

[Dreamhack] rev-basic-5 write up

2023. 1. 22. 22:19

Index

문제
문제풀이
파이썬 풀이 코드
실행 결과


rev-basic-5
Reversing Basic Challenge #5 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요! 획득한 입력값은 DH{} 포맷에 넣어서 인증해주세요. 예시) 입력 값이 AppleBanana일 경우 flag는 DH{AppleBanana} Reference Reverse Engineering Fundamental Roadmap
https://dreamhack.io/wargame/challenges/19

문제

실행 파일(exe)이 주어지고, 실행하면 사용자 입력을 받고 프로그램이 종료된다.

문제풀이

main 함수이다. 이 전 문제들과 동일한 형태이다. 바로 sub_140001000 함수로 들어가보자.

i가 0부터 23까지 24번 반복되고, for문 안의 if 조건문을 역연산하면 되는 문제이다.

if ( *(unsigned __int8 *)(a1 + i + 1) + *(unsigned __int8 *)(a1 + i) != byte_140003000[i] )

뭔가 복잡하게 길어보이지만, 보기 쉽게 바꾸면 다음과 같다.

if (a1[i+1] + a1[i] != byte[i] )

여기서 a1 배열은 사용자가 입력한 문자열이다. 우리는 if 조건문의 결과를 true가 나오면 Wrong이 출력되기 때문에 if 구문이 false이도록 만들어줘야한다.

그 전에, 실행 파일에 저장된 문자열을 확인해보자.

위 사진은 if 조건문에서 비교하는 byte_140003000 배열이다. F2로 브레이크 포인터를 걸고 F9로 실행시켜서 프로그램에 적재된 메모리를 찾아가서 확인했다.

사용자 입력 값이 들어오면 위의 수식을 거치고, 최종적인 값이 저 값이 되어야 한다. 수식을 펜으로 그려보면 다음과 같다. (x, y, z, a, b, c는 임의의 사용자 입력값)

이 값을 반대로 생각해서 원래의 입력 값인 x, y, z, a, b, c 등을 알아내야 한다. 문제에서는 for문으로 i가 0부터 23까지 총 24번을 반복한다. 이 문제에서의 핵심 키는 마지막 23번 인덱스의 값이 0x00이라는 것이다. 즉, byte[22] = input[22] + input[23]에서 input[23] = 0x00 이므로, input[22]는 위에서 확인함과 같은 0x4c가 된다.

이처럼 뒤에서 부터 앞으로 값을 구할 수 있다. 펜으로 그려보면 다음 사진과 같다.

이 로직이 이해가 됐다면, 나머지는 파이썬 코드를 통해 플래그 문자열을 얻을 수 있다.

파이썬 풀이 코드

str = [0xAD, 0xD8, 0xCB, 0xCB, 0x9D, 0x97, 0xCB, 0xC4, 0x92, 0xA1, 0xD2, 0xD7, 0xD2, 0xD6, 0xA8, 0xA5, 0xDC, 0xC7, 0xAD, 0xA3, 0xA1, 0x98, 0x4C, 0x00]
byte = [0 for i in range(len(str))]

for i in range(len(str)-1, 0, -1):
    byte[i-1] = str[i-1] - byte[i]

for i in range(len(byte)):
    print(chr(byte[i]), end="")

실행 결과


Uploaded by N2T

    'Reversing' 카테고리의 다른 글
    • [Dreamhack] rev-basic-7 write up
    • [Dreamhack] rev-basic-6 write up
    • [Dreamhack] rev-basic-4 write up
    • [Dreamhack] rev-basic-3 write up
    e_yejun
    e_yejun
    정리노트 •_•

    티스토리툴바