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)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
e_yejun

Jun_ : Pwn

Reversing

[Dreamhack] rev-basic-8 write up

2023. 1. 25. 00:03

Index

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


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

문제

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

문제풀이

main 함수이다. if 조건문 안의 sub_140001000함수를 확인해보자.

for문 안의 if조건문을 역연산하여 false 반환을 하도록 만들어야 한다.

if ( (unsigned __int8)(-5 * *(_BYTE *)(a1 + i)) != byte_140003000[i] )

마이너스를 곱해주는 연산이다. -5의 자료형이 unsigned int 자료형이므로, 0xfb로 사용된다.

F2로 브레이크 포인터를 걸고 F9로 실행시켰다. 프로그램이 실행되면서 0x7ff69e223000 배열에 문자가 저장된 걸 확인할 수 있다.

if 조건문의 어셈블리어이다. imul명령어로 0xfb를 곱해준다. 그리고 1byte만 사용할 수 있도록 0xff를 and연산한다. 이 흐름을 그대로 구현하여, ascii 문자값을 모두 브루트포싱하여 식에 맞는 값을 저장하고 출력한다.

파이썬 풀이 코드

str = [0xAC, 0xF3, 0x0C, 0x25, 0xA3, 0x10, 0xB7, 0x25, 0x16, 0xC6, 0xB7, 0xBC, 0x07, 0x25, 0x02, 0xD5, 0xC6, 0x11, 0x07, 0xC5]
result = []
for i in range(0, len(str)):
    for bt in range(33,127):
        if ((-5 * bt) & 0xff == str[i]):
            result.append(bt)

for i in result:
    print(chr(i), end='')

실행 결과


Uploaded by N2T

    'Reversing' 카테고리의 다른 글
    • [Cheat Engine] 치트엔진으로 핵 토글화해서 exe로 만들기
    • [Dreamhack] rev-basic-9 write up
    • [Dreamhack] rev-basic-7 write up
    • [Dreamhack] rev-basic-6 write up
    e_yejun
    e_yejun
    정리노트 •_•

    티스토리툴바