rev-basic-6 풀이

2025. 2. 23. 22:21·Security/Reverse Engineering

문제 설명

 

문제 풀이(IDA)

문제 파일을 IDA에서 열고 디컴파일 기능을 사용해보자. 그리고 바로 문자열 비교 함수 내부로 들어가보자.

코드 자체는 오히려 앞선 문제들보다 훨씬 이해하기 쉬웠다.

이 문제만의 차이점이라하면... 항상 데이터들은 140003000 주소에 저장이 되어있었는데, 이번에는 140003020 주소에도 저장이 되어있었다.

 

이번에는 특별히 이 함수가 어떤 호출 규약을 사용하는지 알아보았다.

 

함수 호출 규약이란 "함수가 호출될 때 인자를 전달하는 방식, 반환값을 처리하는 방법, 스택 정리 방식 등을 정의하는 규칙"을 말한다.

다양한 호출 규약들이 있는데 쉽게 정리하자면 다음과 같다.

 

함수 호출 규약 종류

__cdecl : 스택을 통해 인자 전달, Caller가 스택 정리(주로 C컴파일러에서 사용되는 방식)

__stdcall : 스택을 통해 인자 전달, Callee가 스택 정리(주로 Win32 API)

__fastcall : rcx, rdx를 사용하여 첫 번째, 두 번째 인자 전달(기본적으로 stdcall과 같지만 함수에 전달하는 파라미터 일부(2개까지)를 스택 메모리가 아닌 레지스터를 이용하여 전달한다는 것이 특징)

 

이번 문제에서는 어떤 호출 규약을 사용하는지 알아보기 위해 어셈블리 코드를 살펴보았다.

ret 명령이 있기전에 add rsp, 18로 스택을 정리하고 있기 때문에 __stdcall 규약을 사용했다고 볼 수 있을 것 같다...

 

아무튼 다시 돌아와서!

dump 창을 통해 어떤 값이 얼마나 들어있는지 확인해보자.

140003000 주소에는 두줄 밖에 안되는 값들이 들어있었는데, 140003020 주소에는 상당히 많은 값들이 들어있었다.

 

디컴파일된 코드를 활용해서 파이썬 코드를 짤 때 위의 값들을 리스트로 넣으려고 했는데, 수작업으로는 귀찮아서 GPT 쌤에게 정리를 맡겼다.

 

그리고 정리된 리스트 두개를 활용하여 다음과 같은 코드를 작성해보았다.

byte_140003000 = [
    0x00, 0x4D, 0x51, 0x50, 0xEF, 0xFB, 0xC3, 0xCF, 0x92, 0x45,
    0x4D, 0xCF, 0xF5, 0x04, 0x40, 0x50, 0x43, 0x63
] 

byte_140003020 = [
    0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67,
    0x2B, 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA,
    0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72,
    0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34,
    0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 0x04, 0xC7, 0x23,
    0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB,
    0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A,
    0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53,
    0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE,
    0x39, 0x4A, 0x4C, 0x58, 0xCF, 0xD0, 0xEF, 0xAA, 0xFB, 0x43,
    0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F,
    0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC,
    0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13,
    0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64,
    0x5D, 0x19, 0x73, 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90,
    0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, 0xE0,
    0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC,
    0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, 0x8D,
    0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE,
    0x08, 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8,
    0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5,
    0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86,
    0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E,
    0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 0x8C,
    0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D,
    0x0F, 0xB0, 0x54, 0xBB, 0x16
]

temp = []
for i in range(18):
    for j in range(255):
        if(byte_140003000[i] == byte_140003020[j]):
            temp.append(j)

result = "".join(chr(x) for x in temp)
print(result)

 

디컴파일된 코드를 통해

byte_140003020[a1[i]] = byte_140003000[i]

 

라는 정보를 얻었기 때문에 덤프값 즉, byte_140003000[i]와 일치하는 byte_140003020[j] 값을 찾으려고 했다. 

a1[i]는 중요하지 않다. j 가 곧 a1[i]의 값이기 때문이다.

 

밖에 있는 반복문은 0x12(18)번, 안에서 도는 반복문은 byte_140003020[]의 데이터 개수 만큼 돌렸다. 그리고 다음과 같은 결과를 얻을 수 있었다.

 

FLAG : 

DH{Replac3_the_w0rld}

 

 

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

rev-basic-5 풀이  (0) 2025.02.24
rev-basic-4 풀이  (0) 2025.02.24
rev-basic-3 풀이(IDA)  (0) 2025.02.20
rev-basic-3 풀이  (0) 2025.02.05
리버싱 기초 문제 풀이  (0) 2025.02.04
'Security/Reverse Engineering' 카테고리의 다른 글
  • rev-basic-5 풀이
  • rev-basic-4 풀이
  • rev-basic-3 풀이(IDA)
  • rev-basic-3 풀이
switch_user
switch_user
나의 공부 기록
  • switch_user
    while(true)
    switch_user
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C
      • C++
      • Java
      • Python
      • Web
      • App
      • Security
        • Web Hacking
        • Reverse Engineering
      • DB
      • Machine Learning
      • Computer Science
      • Linux
      • Algorithm
      • 진로
      • 기타
  • 블로그 메뉴

    • 홈
    • 태그
    • velog
    • Github
  • 링크

    • velog
    • Github
  • 공지사항

  • 인기 글

  • 태그

    코드 패치
    HTML
    배치 학습
    x64dbg
    어셈블리
    SQLi
    어셈블리어
    생성자와 소멸자
    인터프리팅
    리버싱
    디컴파일
    머신러닝
    ml
    xss
    사례 기반 학습
    웹해킹
    SQL
    cin.getline
    CSS
    웹
    IDA
    비트연산
    쿠키
    클래스 외부에 함수 구현
    race condition
    Hacking Process
    반복문
    Web 기초
    HTTP
    모델 기반 학습
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
switch_user
rev-basic-6 풀이
상단으로

티스토리툴바