Codegate 2018 Prequal RedVelvet

Writeup Jun 14, 2018

개요

RedVelvet - 182pts (Rev)
Happiness:)
Solve 28

Download

다운로드가 안된다면 이곳에서 해주세요!

(Junior 으로 참가하여서 일반부와는 문제의 점수가 다를 수 있습니다.)

풀이

이 바이너리를 가상머신에서 실행시키면 입력을 한 번 받고 바로 종료한다.

먼저, IDA 를 통해서 바이너리를 분석해보았다.

source

27 글자만큼의 입력을 받고, func1 ~ func15 까지 거친 후 입력값을 SHA256 해시를 한 이후, 플래그의 해시로 추정되는 s2 와 같은지 검사한다.

func 함수들 안에는 만약 플래그의 조건이 맞지 않다면 종료하는 구문이 있었기에, angr 를 사용하였다.

아래와 같은 코드를 짜고, 실행시켰다.

from angr import *

p = Project("./RedVelvet", load_options={'auto_load_libs': False})
ex = p.surveyors.Explorer(find=(0x0000000000401546, ), avoid=(0x00000000004007D0,))
ex.run()

print("\"" + ex.found[0].state.posix.dumps(0) + "\"")
print(ex.found[0].state.posix.dumps(0).encode("hex"))
'''

출력은 다음과 같이 나왔다.

What_You_Wanna_Be?:)_lc_la**\x02\x0e\x8a\x8aJ\x0e\x8a\x8a\x1a\x1a\x02\x08\x0e*JJ\x8a*\x0e\n\x8a*JJ\x02\x02J\x8a\x0b\x8a*\x08\x00

그런데 뒷부분이 조금 이상하게 나왔다.

이 바이너리에서 받는 입력은 27글자이다. 널바이트를 포함한다면, What_You_Wanna_Be?:)_lc_la 까지이다.

그래서 What_You_Wanna_Be?:)_lc_la 를 그대로 넣어봤지만 올바르지 않다고 떴고,

조금의 게싱을 동원하여 lc_lala_la 로 바꾼 후에 넣어봤더니

shgroup@ubuntu:/mnt/hgfs/Writeup/ctf/codegate/2018-Prequal/Reversing/RedVelvet$ ./RedVelvet
Your flag : What_You_Wanna_Be?:)_la_la
HAPPINESS:)
HAPPINESS:)
HAPPINESS:)
HAPPINESS:)
HAPPINESS:)
HAPPINESS:)
HAPPINESS:)
HAPPINESS:)
HAPPINESS:)
HAPPINESS:)
HAPPINESS:)
HAPPINESS:)
HAPPINESS:)
HAPPINESS:)
HAPPINESS:)
flag : {" What_You_Wanna_Be?:)_la_la "}

다음과 같이 맞다고 하였다.

Flag

What_You_Wanna_Be?:)_la_la

Tags

Sunghun Kim

Sunghun Kim (a.k.a. SHGroup, KSHGroup)

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.