壓倒
Ye0L
壓倒
Total
Home
Today
  • ByO (59)
    • 악성코드분석🍳 (10)
      • Android (2)
      • Windows (8)
    • 백준⌨ (1)
    • 개발💻 (14)
      • Python (14)
      • C (0)
    • AI (2)
      • ML (2)
      • DL (0)
    • Dreamhack (23)
      • Web hacking (20)
      • Reversing (3)
    • CTF (5)
      • Forensic (5)
    • Study (4)
      • Linux (2)
      • Web (2)

블로그 메뉴

  • 홈
  • 방명록
  • 깃허브😀
  • 티스토리 홈

공지사항

인기 글

태그

  • CSRF
  • dreamhack
  • 드림핵
  • File Download Vulnerability
  • [DigitalForensic]with CTF
  • Crawling
  • 크롤링
  • web hacking
  • Background:Web Browser
  • reversing
  • selenium
  • forensic
  • 리버싱
  • 악성코드분석
  • Raccoon Stealer
  • APK 구조
  • Raccoon Stealer v2
  • ClientSide: XSS
  • PYTHON
  • Background: Cookie & Session

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
壓倒

Ye0L

Dreamhack/Reversing

[Reversing] rev-basic-6 문제 풀이

2023. 1. 9. 18:12

문제


정적 분석


이번 문제의 main() 또한 전과 동일한 형태인 것을 확인하였다.

main()

다음으로 조건문인 compare_fun() 내부는 다음과 같았다. 자세히 보면 입력값의 값을 다시 인덱스로 사용하여 값을 비교하는 것을 알 수 있다.

compare_fun()

다시 인덱싱을 하는 것을 확인한 후 생각한 풀이 방법은 다음과 같다.

생각한 풀이 방법
  1. byte_140003000 에 존재하는 값을 byte_140003020 에서 인덱싱한다.
  1. list.index()의 결과는 인덱스 번호이기 때문에 인덱스 번호가 실제 Flag 일 것이다

코드


실제 코드를 작성하기 전 byte_140003020과 byte_140003000 값을 추출한다. 추출하는 코드는 다음과 같다.

byte_140003000
print(list(ida_bytes.get_bytes(here(), 18)))

byte_140003000은 이전 문제와 동일한 형태의 값이 존재하였으나, byte_140003020은 여러 줄로 이루어진 것을 알 수 있다.

byte_140003020

byte_140003020의 값을 추출하기 위해 byte_140003020의 크기를 살펴보면 0x100(하이라이팅된 주솟값) 크기임을 알 수 있고 다음과 같은 코드를 작성한 후 실행할 경우 정상적으로 값이 추출된다.

byte_140003020 크기

byte_140003000의 값을 right_list에 대입하고 byte_140003020 값을 left_list에 대입한다.

right_list = [0, 77, 81, 80, 239, 251, 195, 207, 146, 69, 77, 207, 245, 4, 64, 80, 67, 99]
left_list = [99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 
             89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 
             113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 
             110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74,
             76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146,
             157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 
             100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58,
             10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86,
             244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112,
             62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 
             135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22]

이후 right_list에 존재하는 값들을 left_list에서 인덱싱하고 인덱싱결과를 최종 결과인 result_list에 추가한다.

result_list = []
for i in range(18):
    val = left_list.index(right_list[i])
    result_list.append(val)
    print(chr(result_list[i]), end='')

최종 코드는 다음과 같다.

right_list = [0, 77, 81, 80, 239, 251, 195, 207, 146, 69, 77, 207, 245, 4, 64, 80, 67, 99]
left_list = [99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 
             89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 
             113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 
             110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74,
             76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146,
             157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 
             100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58,
             10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86,
             244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112,
             62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 
             135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22]
result_list = []
for i in range(18):
    val = left_list.index(right_list[i])
    result_list.append(val)
    print(chr(result_list[i]), end='')

Flag


DH{Replac3_the_w0rld}

오류, 잘못된 점 또는 궁금한 점이 있으시다면 댓글 남겨주세요❗


Uploaded by N2T

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

[Reversing] rev-basic-8 문제 풀이  (0) 2023.01.11
[Reversing] rev-basic-5 문제 풀이  (0) 2023.01.09
    'Dreamhack/Reversing' 카테고리의 다른 글
    • [Reversing] rev-basic-8 문제 풀이
    • [Reversing] rev-basic-5 문제 풀이
    壓倒
    壓倒
    악성코드 분석, 개발, 백준 등 나의 일지

    티스토리툴바