SlideShare a Scribd company logo
BSides Delhi CTF 2018 WriteUp
avap (Reversing 75points)
by 이 세 한 (Alchemic)
2
BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
다음과 같이 문제가 주어집니다.
CTF에 참여하는 모든 분들을 위한 쉬운 문제라고 합니다.
3
파일을 살펴보면 다음과 같이 ELF x64 바이너리 파일인 것을 확인할 수 있습니다.
이는 리눅스에서 실행 가능한 바이너리를 의미하며, 64bit 환경에서 동작하는 것을
의미합니다.
BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
4
[IDA Pro]를 이용하여 바이너리를
살펴보면, 다음과 같은 main 함수를
확인할 수 있습니다.
0x4006F5 부터 0x400751 까지
특정한 바이트가 입력되어 있고,
사용자로부터 키보드 입력을 받아서
두 문자열을 비교하는 순으로 진행이
되는 것을 확인할 수 있습니다.
특정 바이트
문자열 키보드 입력
문자열 비교
BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
5
BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
특정 바이트들을 ASCII 코드 테이블을 참조하여 문자로 바꾸면 다음과 같습니다.
rbp+var_40 = 0x61 => a
rbp+var_3F = 0x6B => k
rbp+var_3E = 0x66 => f
rbp+var_3D = 0x60 => `
rbp+var_3C = 0x7C => |
rbp+var_3B = 0x33 => 3
…
음... flag 라고 생각하기 힘든 문자들입니다.
main 함수의 마지막 부분을 보면 항상 깊이 파보라는(?) 말이 있으니...
더 분석을 진행하도록 하겠습니다.
!!!!!
6
BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
[_start] 부분을 확인해보도록 하겠습니다.
0x40056D 을 확인하게되면 rdi 값에 [main] 함수의 주소값이 들어가는 것이 아니라, [check]
함수의 주소값이 들어가는 것을 확인할 수 있습니다.
즉, 프로그램이 시작되면 [main] 함수가 실행되는 것이 아니라 [check] 함수가 실행되어지는
것입니다.
main으로 실행되는 함수 => check
7
BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
[check 함수]
[check 함수의 의사코드]
[check] 함수의 C 스타일 의사코드를 확인해보도록 하겠습니다.
변수 v4의 값을 계산할 수 있는 식이 보입니다.
조건식이 {v4 * (v4 – 14) == -49 && v4 <= 24 && v4} 이므로, 간단히 보면 변수 v4의 값은
24보다 작거나 같고, [v4 * (v4-14) = -49] 라는 식을 만족하는 값이면 되는 것입니다.
결국 간단한 수학문제이므로, 변수 v4의 값은 ‘7’ 이라는 것을 쉽게 찾을 수 있습니다.
또한, 변수 v4의 값을 변수 key값으로 주는 것을 확인할 수 있습니다.
8
BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
9
[check] 함수를 확인했으므로, 다시
[main] 함수에서 어떤 일들이 발생
하는지를 확인하도록 하겠습니다.
main 함수의 마지막 부분을 보면
키보드 입력이 끝난 후, [strcmp_]
함수를 호출하는 것을 확인할 수
있습니다.
특정 바이트
문자열 키보드 입력
문자열 비교
BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
10
BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
[strcmp_ 함수의 일부]
[strcmp_ 함수의 의사코드]
11
BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
[strcmp_] 함수의 C 스타일 의사코드를 확인해보도록 하겠습니다.
Junk 코드가 먼저 보이고, 그 다음에 이전 main 함수에서 이미 입력되어 있던 특정 바이트들에
‘xor key’ 연산을 수행한 뒤, 시스템 함수인 [strncmp] 함수를 호출하여 새롭게 연산된
특정 바이트들(문자열)과 사용자로부터 입력받은 문자열을 비교하는 것을 확인할 수 있습니다.
변수 key의 값은 이전 [check] 함수에서 ‘7’이라는 것을 알 수 있고,
이를 토대로 특정 바이트들을 연산하는 간단한 프로그램을 작성해보도록 하겠습니다.
Junk Code
Main 함수에 입력되어 있던
특정 바이트에 [XOR 7] 연산 진행
시스템 함수인 [strncmp] 함수를 호출하여 문자열 비교
12
BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
마침내 flag 값을 확인할 수 있습니다!
The flag is... flag{4s_e45y_4s_1t_g3ts}
Thank You!
Contact
sehands@sju.ac.kr

More Related Content

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 [avap (Reversing 75pts)] WriteUp

  • 1. BSides Delhi CTF 2018 WriteUp avap (Reversing 75points) by 이 세 한 (Alchemic)
  • 2. 2 BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)] 다음과 같이 문제가 주어집니다. CTF에 참여하는 모든 분들을 위한 쉬운 문제라고 합니다.
  • 3. 3 파일을 살펴보면 다음과 같이 ELF x64 바이너리 파일인 것을 확인할 수 있습니다. 이는 리눅스에서 실행 가능한 바이너리를 의미하며, 64bit 환경에서 동작하는 것을 의미합니다. BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
  • 4. 4 [IDA Pro]를 이용하여 바이너리를 살펴보면, 다음과 같은 main 함수를 확인할 수 있습니다. 0x4006F5 부터 0x400751 까지 특정한 바이트가 입력되어 있고, 사용자로부터 키보드 입력을 받아서 두 문자열을 비교하는 순으로 진행이 되는 것을 확인할 수 있습니다. 특정 바이트 문자열 키보드 입력 문자열 비교 BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
  • 5. 5 BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)] 특정 바이트들을 ASCII 코드 테이블을 참조하여 문자로 바꾸면 다음과 같습니다. rbp+var_40 = 0x61 => a rbp+var_3F = 0x6B => k rbp+var_3E = 0x66 => f rbp+var_3D = 0x60 => ` rbp+var_3C = 0x7C => | rbp+var_3B = 0x33 => 3 … 음... flag 라고 생각하기 힘든 문자들입니다. main 함수의 마지막 부분을 보면 항상 깊이 파보라는(?) 말이 있으니... 더 분석을 진행하도록 하겠습니다. !!!!!
  • 6. 6 BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)] [_start] 부분을 확인해보도록 하겠습니다. 0x40056D 을 확인하게되면 rdi 값에 [main] 함수의 주소값이 들어가는 것이 아니라, [check] 함수의 주소값이 들어가는 것을 확인할 수 있습니다. 즉, 프로그램이 시작되면 [main] 함수가 실행되는 것이 아니라 [check] 함수가 실행되어지는 것입니다. main으로 실행되는 함수 => check
  • 7. 7 BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)] [check 함수] [check 함수의 의사코드]
  • 8. [check] 함수의 C 스타일 의사코드를 확인해보도록 하겠습니다. 변수 v4의 값을 계산할 수 있는 식이 보입니다. 조건식이 {v4 * (v4 – 14) == -49 && v4 <= 24 && v4} 이므로, 간단히 보면 변수 v4의 값은 24보다 작거나 같고, [v4 * (v4-14) = -49] 라는 식을 만족하는 값이면 되는 것입니다. 결국 간단한 수학문제이므로, 변수 v4의 값은 ‘7’ 이라는 것을 쉽게 찾을 수 있습니다. 또한, 변수 v4의 값을 변수 key값으로 주는 것을 확인할 수 있습니다. 8 BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
  • 9. 9 [check] 함수를 확인했으므로, 다시 [main] 함수에서 어떤 일들이 발생 하는지를 확인하도록 하겠습니다. main 함수의 마지막 부분을 보면 키보드 입력이 끝난 후, [strcmp_] 함수를 호출하는 것을 확인할 수 있습니다. 특정 바이트 문자열 키보드 입력 문자열 비교 BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)]
  • 10. 10 BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)] [strcmp_ 함수의 일부] [strcmp_ 함수의 의사코드]
  • 11. 11 BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)] [strcmp_] 함수의 C 스타일 의사코드를 확인해보도록 하겠습니다. Junk 코드가 먼저 보이고, 그 다음에 이전 main 함수에서 이미 입력되어 있던 특정 바이트들에 ‘xor key’ 연산을 수행한 뒤, 시스템 함수인 [strncmp] 함수를 호출하여 새롭게 연산된 특정 바이트들(문자열)과 사용자로부터 입력받은 문자열을 비교하는 것을 확인할 수 있습니다. 변수 key의 값은 이전 [check] 함수에서 ‘7’이라는 것을 알 수 있고, 이를 토대로 특정 바이트들을 연산하는 간단한 프로그램을 작성해보도록 하겠습니다. Junk Code Main 함수에 입력되어 있던 특정 바이트에 [XOR 7] 연산 진행 시스템 함수인 [strncmp] 함수를 호출하여 문자열 비교
  • 12. 12 BSides Delhi CTF 2018 WriteUp [avap (Reversing 75points)] 마침내 flag 값을 확인할 수 있습니다! The flag is... flag{4s_e45y_4s_1t_g3ts}