SlideShare a Scribd company logo
BSides Delhi CTF 2018 WriteUp
st4t1c (Reversing 200points)
by 이 세 한 (Alchemic)
2
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
다음과 같이 문제가 주어집니다.
문제의 설명으로 보았을 때, 정적 분석 문제로 보여집니다.
3
우선 문제 파일이 무엇인지 확인해보도록 하겠습니다.
ELF 64-bit 파일이므로 리눅스 바이너리 실행 파일이며, 64bit 환경에서 동작하는 것이라고
파악할 수 있습니다.
문제에 이미 정적 분석(static analysis)이라는 말이 나와있으므로, IDA Pro 로 바이너리를
열어서 분석을 진행하도록 하겠습니...???
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
왜 main 함수가 없지??
Graph Mode로 보여주는 것을 실패?!
4
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
메인 함수도 없고... 그래프 모드로 보여주는 기능도 안된다고 합니다.
아무래도 IDA Pro 가 바이너리를 제대로 해석을 하지 못하는 것으로 보여집니다.
Anti Analysis 기법이 적용된 바이너리인지 조사를 진행해보도록 하겠습니다.
???
5
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
코드를 조사하다보면 중간 중간에 0xCC (INT instruction) 가 있는 것을 확인할 수 있습니다.
이는 Anti Analysis 기법 중 하나로서 일부 바이트가 분기의 fallthrough 위치에 기록되어서
디컴파일러가 제대로 해석을 하지 못하도록 하는 것입니다.
이는 간단하게 0x90 (NOP instruction) 으로 패치를 진행해주면 디컴파일러가 다시 제대로
해석을 할 수 있게 됩니다.
6
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
위 그림과 같이 HEX Editor 를 이용하여 0xCC (INT instruction) 을 검색하여 해당 부분을
0x90 (NOP instruction) 으로 수정하면 패치가 완료됩니다.
모든 부분을 수정한 뒤, 다시 IDA Pro 를 이용하여 바이너리를 열게 되면 제대로 해석이 되어서
분석을 쉽게 할 수 있게 되는 것을 확인할 수 있습니다.
7
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
패치를 진행하고 다시 IDA Pro 를 이용하여 바이너리 파일을 열게 되면, 이번에는 제대로
main 함수가 나타나고, main 함수의 C 스타일 의사 코드도 제대로 해석이 되어서 분석을
진행할 수 있는 상태가 되는 것을 확인할 수 있습니다.
이제 본격적으로 분석을 진행하도록 하겠습니다.
8
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
먼저 main 함수를 분석해보면 다음과 같은 간단한 알고리즘으로 볼 수 있습니다.
Start
s1 = 환경 변수 ‘team_name’의 값
s1 == “bi0s”
End
argc == 2
sub_7EC(s1,
argv[1]) == 1
sub_7A0(argv[1])
Y
Y
Y
N
N
N
①
②
③
① s1에 환경 변수 ‘team_name’의 값을 저장
하는데, 이를 바로 “bi0s”와 비교를 하므로,
s1에 저장되는 문자열은 “bi0s” 인 것을 확인
할 수 있습니다.
② 앞서 확인된 환경 변수 ‘team_name’의 값인
“bi0s” 문자열과 main 함수의 두 번째 인수
(argv[1])를 sub_7EC 함수에 인자로 전달하고,
함수에서 리턴값이 1인지 아닌지를 판단하게
됩니다.
③ 이전 ② 에서 true가 되면 main 함수의 두 번째
인수인 argv[1]을 sub_7A0 함수에 인자로 전달
하게 됩니다.
9
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
메인 함수에서 살펴보았을 때, 두 함수 (sub_7EC, sub_7A0) 가 등장 했으므로, 두 함수를
분석하도록 하겠습니다.
먼저, sub_7A0 함수를 분석해보면, 단순히 main 함수에서 넘겨받은 인수를 출력해주는
함수인 것을 알 수 있습니다.
그리고 출력을 할 때, 플래그를 출력해주는 것으로 보아 넘겨받은 인수가 flag 인 것을 알 수
있습니다!
즉, 메인 함수에서 분석한 알고리즘에 의하면 argv[1] 이 flag 인 것입니다!
결국 이 바이너리는 flag 문자열을 입력받고 그 flag 가 옳은 것인지 확인하는 바이너리로
판단할 수 있습니다.
10
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
[sub_7EC 함수의 어셈블리 코드 일부분]
[sub_7EC 함수의 C 스타일 의사 코드]
11
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
sub_7EC 함수에서의 알고리즘을 분석해보도록 하겠습니다.
함수에서의 두 인수 a1, a2는 각각 main 함수에서의 s1, argv[1] 입니다.
먼저, 특정 바이트들이 입력되어 있는 것을 확인할 수 있습니다.
다음으로 함수의 인수 중 a2 의 문자열 길이가 22 인지를 판단하는 부분이 나타납니다.
22자리 문자열이 맞으면, 변수 v14의 값을 구하는 연산이 등장합니다.
v14 = ‘b’ + ‘i’ + ‘0’ + ‘s’ = 0x62 + 0x69 + 0x30 + 0x73 = 0x16E / 30 = 0xc
v14 의 값을 구했고, 그 다음 연산을 분석해보도록 하겠습니다.
그 다음 연산은 인수 a2 를 이용해서 새로운 값을 계산하는 과정이 나타납니다.
12
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
a2 : ? ? ? ? ? …? ? ? ? ? ? ?
Index : 0 1 2 3 4 5 6 7 8 9 20 21
…
4 4 4 4 4 4 4 4 4 4 4 4…
v5 : ?? ?? ?? ?? ?? …?? ?? ?? ?? ?? ?? ??
xor 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc
v5 : ??? ??? ??? ??? ??? …??? ??? ??? ??? ??? ??? ???
…
…
연산을 거쳐서 변수 v5 에 연산된 값이 저장되는 것을 확인하였습니다.
다음으로는 v5 에 저장된 값과 미리 입력되어 있던 특정 바이트 들과 비교하는 코드를 확인할 수
있습니다.
13
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
v5 : ??? ??? ??? ??? ??? …??? ??? ??? ??? ??? ??? ???
특정 바이트 : 0x7C 0x23 0x34 0x62 0x7E 0x57 0x37 0x68 0x3B 0x57 0x35 0x3F…
서로 같은가?
return 0;
N
result = 1;
22번 반복이 모두 끝나면
14
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
앞서 12쪽과 13쪽에서 살펴본 연산 과정들을 이용하면 main 함수 에서의 argv[1] 입력값을
찾아낼 수 있습니다.
15
BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)]
드디어 flag 를 확인할 수 있습니다!
The flag is... flag{l34rn_7h3_b451c5_f1r57}
Thank You!
Contact
sehands@sju.ac.kr

More Related Content

Similar to BSides Delhi CTF 2018 [st4t1c (Reversing 200pts)] WriteUp

C++ 프로그래밍 2014-2018년 기말시험 기출문제
C++ 프로그래밍 2014-2018년 기말시험 기출문제C++ 프로그래밍 2014-2018년 기말시험 기출문제
C++ 프로그래밍 2014-2018년 기말시험 기출문제
Lee Sang-Ho
 
모던 C++ 정리
모던 C++ 정리모던 C++ 정리
모던 C++ 정리
Hansol Kang
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11OnGameServer
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010devCAT Studio, NEXON
 
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
Seok-joon Yun
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
흥배 최
 
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) 파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
Tae Young Lee
 
김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...
김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...
김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...devCAT Studio, NEXON
 
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
Yi-kwon Hwang
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
Jaeseung Ha
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
Ryan Park
 
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
Taeyoung Kim
 
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
GangSeok Lee
 
micro:bit 프로그래밍 기초
micro:bit 프로그래밍 기초 micro:bit 프로그래밍 기초
micro:bit 프로그래밍 기초
Jong-Hyun Kim
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
Sungik Kim
 

Similar to BSides Delhi CTF 2018 [st4t1c (Reversing 200pts)] WriteUp (16)

C++ 프로그래밍 2014-2018년 기말시험 기출문제
C++ 프로그래밍 2014-2018년 기말시험 기출문제C++ 프로그래밍 2014-2018년 기말시험 기출문제
C++ 프로그래밍 2014-2018년 기말시험 기출문제
 
모던 C++ 정리
모던 C++ 정리모던 C++ 정리
모던 C++ 정리
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
 
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
 
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) 파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
 
김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...
김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...
김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...
 
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
 
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
 
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
 
micro:bit 프로그래밍 기초
micro:bit 프로그래밍 기초 micro:bit 프로그래밍 기초
micro:bit 프로그래밍 기초
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 

More from Sehan Lee

BSides Delhi CTF 2018 [Never Too Late Mister (Forensics 200pts)] WriteUp
BSides Delhi CTF 2018 [Never Too Late Mister (Forensics 200pts)] WriteUpBSides Delhi CTF 2018 [Never Too Late Mister (Forensics 200pts)] WriteUp
BSides Delhi CTF 2018 [Never Too Late Mister (Forensics 200pts)] WriteUp
Sehan Lee
 
Plaid CTF 2017 Write-Up [zipper (MISC 50pts)]
Plaid CTF 2017 Write-Up [zipper (MISC 50pts)]Plaid CTF 2017 Write-Up [zipper (MISC 50pts)]
Plaid CTF 2017 Write-Up [zipper (MISC 50pts)]
Sehan Lee
 
Mr.Robot CTF Write-Up (Korean version)
Mr.Robot CTF Write-Up (Korean version)Mr.Robot CTF Write-Up (Korean version)
Mr.Robot CTF Write-Up (Korean version)
Sehan Lee
 
SECCON 2016 Online CTF [Memory Analysis] Write-Up (ver.korean)
SECCON 2016 Online CTF [Memory Analysis] Write-Up (ver.korean)SECCON 2016 Online CTF [Memory Analysis] Write-Up (ver.korean)
SECCON 2016 Online CTF [Memory Analysis] Write-Up (ver.korean)
Sehan Lee
 
Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(z...
Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(z...Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(z...
Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(z...
Sehan Lee
 
GoogleCTF 2016 [Wallowing Wallabies - Part One] Write-Up (ver.korean)
GoogleCTF 2016 [Wallowing Wallabies - Part One] Write-Up (ver.korean)GoogleCTF 2016 [Wallowing Wallabies - Part One] Write-Up (ver.korean)
GoogleCTF 2016 [Wallowing Wallabies - Part One] Write-Up (ver.korean)
Sehan Lee
 
GoogleCTF 2016 [No Big Deal] Write-Up (ver.korean)
GoogleCTF 2016 [No Big Deal] Write-Up (ver.korean)GoogleCTF 2016 [No Big Deal] Write-Up (ver.korean)
GoogleCTF 2016 [No Big Deal] Write-Up (ver.korean)
Sehan Lee
 
GoogleCTF 2016 [In Recorded Conversation] Write-Up (ver.korean)
GoogleCTF 2016 [In Recorded Conversation] Write-Up (ver.korean)GoogleCTF 2016 [In Recorded Conversation] Write-Up (ver.korean)
GoogleCTF 2016 [In Recorded Conversation] Write-Up (ver.korean)
Sehan Lee
 
GoogleCTF 2016 [Ernst Echidna] Write-Up (ver.korean)
GoogleCTF 2016 [Ernst Echidna] Write-Up (ver.korean)GoogleCTF 2016 [Ernst Echidna] Write-Up (ver.korean)
GoogleCTF 2016 [Ernst Echidna] Write-Up (ver.korean)
Sehan Lee
 
PlaidCTF 2016 Write-Up [hevc (MISC 50pts)]
PlaidCTF 2016 Write-Up [hevc (MISC 50pts)]PlaidCTF 2016 Write-Up [hevc (MISC 50pts)]
PlaidCTF 2016 Write-Up [hevc (MISC 50pts)]
Sehan Lee
 
Attacking Session Management
Attacking Session ManagementAttacking Session Management
Attacking Session Management
Sehan Lee
 
Web Application Technologies
Web Application TechnologiesWeb Application Technologies
Web Application Technologies
Sehan Lee
 
Packet Tracer를 이용한 OSPF 설정
Packet Tracer를 이용한 OSPF 설정Packet Tracer를 이용한 OSPF 설정
Packet Tracer를 이용한 OSPF 설정
Sehan Lee
 
레이스 컨디션 기초(Basic Race Condition)
레이스 컨디션 기초(Basic Race Condition)레이스 컨디션 기초(Basic Race Condition)
레이스 컨디션 기초(Basic Race Condition)
Sehan Lee
 
Packet tracer 설치 및 사용법
Packet tracer 설치 및 사용법Packet tracer 설치 및 사용법
Packet tracer 설치 및 사용법
Sehan Lee
 

More from Sehan Lee (15)

BSides Delhi CTF 2018 [Never Too Late Mister (Forensics 200pts)] WriteUp
BSides Delhi CTF 2018 [Never Too Late Mister (Forensics 200pts)] WriteUpBSides Delhi CTF 2018 [Never Too Late Mister (Forensics 200pts)] WriteUp
BSides Delhi CTF 2018 [Never Too Late Mister (Forensics 200pts)] WriteUp
 
Plaid CTF 2017 Write-Up [zipper (MISC 50pts)]
Plaid CTF 2017 Write-Up [zipper (MISC 50pts)]Plaid CTF 2017 Write-Up [zipper (MISC 50pts)]
Plaid CTF 2017 Write-Up [zipper (MISC 50pts)]
 
Mr.Robot CTF Write-Up (Korean version)
Mr.Robot CTF Write-Up (Korean version)Mr.Robot CTF Write-Up (Korean version)
Mr.Robot CTF Write-Up (Korean version)
 
SECCON 2016 Online CTF [Memory Analysis] Write-Up (ver.korean)
SECCON 2016 Online CTF [Memory Analysis] Write-Up (ver.korean)SECCON 2016 Online CTF [Memory Analysis] Write-Up (ver.korean)
SECCON 2016 Online CTF [Memory Analysis] Write-Up (ver.korean)
 
Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(z...
Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(z...Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(z...
Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(z...
 
GoogleCTF 2016 [Wallowing Wallabies - Part One] Write-Up (ver.korean)
GoogleCTF 2016 [Wallowing Wallabies - Part One] Write-Up (ver.korean)GoogleCTF 2016 [Wallowing Wallabies - Part One] Write-Up (ver.korean)
GoogleCTF 2016 [Wallowing Wallabies - Part One] Write-Up (ver.korean)
 
GoogleCTF 2016 [No Big Deal] Write-Up (ver.korean)
GoogleCTF 2016 [No Big Deal] Write-Up (ver.korean)GoogleCTF 2016 [No Big Deal] Write-Up (ver.korean)
GoogleCTF 2016 [No Big Deal] Write-Up (ver.korean)
 
GoogleCTF 2016 [In Recorded Conversation] Write-Up (ver.korean)
GoogleCTF 2016 [In Recorded Conversation] Write-Up (ver.korean)GoogleCTF 2016 [In Recorded Conversation] Write-Up (ver.korean)
GoogleCTF 2016 [In Recorded Conversation] Write-Up (ver.korean)
 
GoogleCTF 2016 [Ernst Echidna] Write-Up (ver.korean)
GoogleCTF 2016 [Ernst Echidna] Write-Up (ver.korean)GoogleCTF 2016 [Ernst Echidna] Write-Up (ver.korean)
GoogleCTF 2016 [Ernst Echidna] Write-Up (ver.korean)
 
PlaidCTF 2016 Write-Up [hevc (MISC 50pts)]
PlaidCTF 2016 Write-Up [hevc (MISC 50pts)]PlaidCTF 2016 Write-Up [hevc (MISC 50pts)]
PlaidCTF 2016 Write-Up [hevc (MISC 50pts)]
 
Attacking Session Management
Attacking Session ManagementAttacking Session Management
Attacking Session Management
 
Web Application Technologies
Web Application TechnologiesWeb Application Technologies
Web Application Technologies
 
Packet Tracer를 이용한 OSPF 설정
Packet Tracer를 이용한 OSPF 설정Packet Tracer를 이용한 OSPF 설정
Packet Tracer를 이용한 OSPF 설정
 
레이스 컨디션 기초(Basic Race Condition)
레이스 컨디션 기초(Basic Race Condition)레이스 컨디션 기초(Basic Race Condition)
레이스 컨디션 기초(Basic Race Condition)
 
Packet tracer 설치 및 사용법
Packet tracer 설치 및 사용법Packet tracer 설치 및 사용법
Packet tracer 설치 및 사용법
 

BSides Delhi CTF 2018 [st4t1c (Reversing 200pts)] WriteUp

  • 1. BSides Delhi CTF 2018 WriteUp st4t1c (Reversing 200points) by 이 세 한 (Alchemic)
  • 2. 2 BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)] 다음과 같이 문제가 주어집니다. 문제의 설명으로 보았을 때, 정적 분석 문제로 보여집니다.
  • 3. 3 우선 문제 파일이 무엇인지 확인해보도록 하겠습니다. ELF 64-bit 파일이므로 리눅스 바이너리 실행 파일이며, 64bit 환경에서 동작하는 것이라고 파악할 수 있습니다. 문제에 이미 정적 분석(static analysis)이라는 말이 나와있으므로, IDA Pro 로 바이너리를 열어서 분석을 진행하도록 하겠습니...??? BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)] 왜 main 함수가 없지?? Graph Mode로 보여주는 것을 실패?!
  • 4. 4 BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)] 메인 함수도 없고... 그래프 모드로 보여주는 기능도 안된다고 합니다. 아무래도 IDA Pro 가 바이너리를 제대로 해석을 하지 못하는 것으로 보여집니다. Anti Analysis 기법이 적용된 바이너리인지 조사를 진행해보도록 하겠습니다. ???
  • 5. 5 BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)] 코드를 조사하다보면 중간 중간에 0xCC (INT instruction) 가 있는 것을 확인할 수 있습니다. 이는 Anti Analysis 기법 중 하나로서 일부 바이트가 분기의 fallthrough 위치에 기록되어서 디컴파일러가 제대로 해석을 하지 못하도록 하는 것입니다. 이는 간단하게 0x90 (NOP instruction) 으로 패치를 진행해주면 디컴파일러가 다시 제대로 해석을 할 수 있게 됩니다.
  • 6. 6 BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)] 위 그림과 같이 HEX Editor 를 이용하여 0xCC (INT instruction) 을 검색하여 해당 부분을 0x90 (NOP instruction) 으로 수정하면 패치가 완료됩니다. 모든 부분을 수정한 뒤, 다시 IDA Pro 를 이용하여 바이너리를 열게 되면 제대로 해석이 되어서 분석을 쉽게 할 수 있게 되는 것을 확인할 수 있습니다.
  • 7. 7 BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)] 패치를 진행하고 다시 IDA Pro 를 이용하여 바이너리 파일을 열게 되면, 이번에는 제대로 main 함수가 나타나고, main 함수의 C 스타일 의사 코드도 제대로 해석이 되어서 분석을 진행할 수 있는 상태가 되는 것을 확인할 수 있습니다. 이제 본격적으로 분석을 진행하도록 하겠습니다.
  • 8. 8 BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)] 먼저 main 함수를 분석해보면 다음과 같은 간단한 알고리즘으로 볼 수 있습니다. Start s1 = 환경 변수 ‘team_name’의 값 s1 == “bi0s” End argc == 2 sub_7EC(s1, argv[1]) == 1 sub_7A0(argv[1]) Y Y Y N N N ① ② ③ ① s1에 환경 변수 ‘team_name’의 값을 저장 하는데, 이를 바로 “bi0s”와 비교를 하므로, s1에 저장되는 문자열은 “bi0s” 인 것을 확인 할 수 있습니다. ② 앞서 확인된 환경 변수 ‘team_name’의 값인 “bi0s” 문자열과 main 함수의 두 번째 인수 (argv[1])를 sub_7EC 함수에 인자로 전달하고, 함수에서 리턴값이 1인지 아닌지를 판단하게 됩니다. ③ 이전 ② 에서 true가 되면 main 함수의 두 번째 인수인 argv[1]을 sub_7A0 함수에 인자로 전달 하게 됩니다.
  • 9. 9 BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)] 메인 함수에서 살펴보았을 때, 두 함수 (sub_7EC, sub_7A0) 가 등장 했으므로, 두 함수를 분석하도록 하겠습니다. 먼저, sub_7A0 함수를 분석해보면, 단순히 main 함수에서 넘겨받은 인수를 출력해주는 함수인 것을 알 수 있습니다. 그리고 출력을 할 때, 플래그를 출력해주는 것으로 보아 넘겨받은 인수가 flag 인 것을 알 수 있습니다! 즉, 메인 함수에서 분석한 알고리즘에 의하면 argv[1] 이 flag 인 것입니다! 결국 이 바이너리는 flag 문자열을 입력받고 그 flag 가 옳은 것인지 확인하는 바이너리로 판단할 수 있습니다.
  • 10. 10 BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)] [sub_7EC 함수의 어셈블리 코드 일부분] [sub_7EC 함수의 C 스타일 의사 코드]
  • 11. 11 BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)] sub_7EC 함수에서의 알고리즘을 분석해보도록 하겠습니다. 함수에서의 두 인수 a1, a2는 각각 main 함수에서의 s1, argv[1] 입니다. 먼저, 특정 바이트들이 입력되어 있는 것을 확인할 수 있습니다. 다음으로 함수의 인수 중 a2 의 문자열 길이가 22 인지를 판단하는 부분이 나타납니다. 22자리 문자열이 맞으면, 변수 v14의 값을 구하는 연산이 등장합니다. v14 = ‘b’ + ‘i’ + ‘0’ + ‘s’ = 0x62 + 0x69 + 0x30 + 0x73 = 0x16E / 30 = 0xc v14 의 값을 구했고, 그 다음 연산을 분석해보도록 하겠습니다. 그 다음 연산은 인수 a2 를 이용해서 새로운 값을 계산하는 과정이 나타납니다.
  • 12. 12 BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)] a2 : ? ? ? ? ? …? ? ? ? ? ? ? Index : 0 1 2 3 4 5 6 7 8 9 20 21 … 4 4 4 4 4 4 4 4 4 4 4 4… v5 : ?? ?? ?? ?? ?? …?? ?? ?? ?? ?? ?? ?? xor 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc v5 : ??? ??? ??? ??? ??? …??? ??? ??? ??? ??? ??? ??? … …
  • 13. 연산을 거쳐서 변수 v5 에 연산된 값이 저장되는 것을 확인하였습니다. 다음으로는 v5 에 저장된 값과 미리 입력되어 있던 특정 바이트 들과 비교하는 코드를 확인할 수 있습니다. 13 BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)] v5 : ??? ??? ??? ??? ??? …??? ??? ??? ??? ??? ??? ??? 특정 바이트 : 0x7C 0x23 0x34 0x62 0x7E 0x57 0x37 0x68 0x3B 0x57 0x35 0x3F… 서로 같은가? return 0; N result = 1; 22번 반복이 모두 끝나면
  • 14. 14 BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)] 앞서 12쪽과 13쪽에서 살펴본 연산 과정들을 이용하면 main 함수 에서의 argv[1] 입력값을 찾아낼 수 있습니다.
  • 15. 15 BSides Delhi CTF 2018 WriteUp [st4t1c (Reversing 200points)] 드디어 flag 를 확인할 수 있습니다! The flag is... flag{l34rn_7h3_b451c5_f1r57}