BLOG main image
분류 전체보기 (224)
Reversing (13)
Pwnable (4)
Linux Kernel (3)
Crypto (2)
Wargames (68)
Programming (18)
Write Up (32)
Project (22)
Web (2)
My Life (52)
Memo (3)
etc (2)
발표자료 (1)
42,655 Visitors up to today!
Today 3 hit, Yesterday 27 hit
daisy rss
tistory 티스토리 가입하기!
'Write Up'에 해당되는 글 32건
2016.02.01 17:36


이번에는 500점 짜리 문제입니다. 500점 짜리인 만큼 난이도가 꽤 있었습니다. 역시 64비트 바이너리인데 IDA로 열자마자 입에서 욕이 나왔었습니다... 열어보면 

IDA의 그래프 개형이 이렇게 생겼기 때문입니다. 처음에는 열고 나서 다시 닫았습니다. 생긴 것이 꼭 핀툴을 써서 해야 할 것처럼 생겨서 이 문제는 접어야 겠다 하고 닫았었는데 시간이 좀 지나고 다시 분석해보자 하고 열어서 좀 보니까 뭔가 될 것도 같아서 분석을 시작했습니다. 일단 헥스레이로 보면 

엄청난 양의 반복문이 중첩으로 존재합니다. 프로그램을 난독화 시켜 놓은 것인지는 모르겠는데 v37을 기준으로 그 값에 어떠한 값이 들어 있냐에 따라 프로그램 흐름이 달라지는 방식입니다. 그래서 분석을 해 보면 먼저 

이 부분에서 입력을 받는데 반복문을 돌면서 총 16번 입력을 받습니다. 그 값을 v64배열에 저장하고 dest에 모두 이어 붙입니다. 다 입력을 받으면 

이러한 부분이 다시 16개가 있는데 각 배열 원소 하나마다 각각 sub_400780함수를 호출할 때 함께 인자로 넣어주는 값이 다릅니다. 저기서 저 함수의 리턴값이 0이 아니라면 실패 부분으로 분기하게 됩니다. 즉, 우리는 0이 나오는 값을 찾아야 하는데 저 함수 내용 역시 

이렇게 되어 있고 & 연산이 주를 이루기에 역시 역연산을 하기에는 무리가 있어 보입니다. 즉, 저 함수를 다시 가져와서 브루트포싱을 해 주면 해결할 수 있게 됩니다. 

이런 식으로 해당되는 값들을 구해주면 됩니다. 여기까지는 이전 문제와 비슷합니다. 그런데 중요한 것은 여기서 위에 해당하는 값들이 하나가 아니라는 것입니다. 16개의 값들 모두 찾아본 결과 

4, 45, 72 - 0 (11)
8 - 1 (12)
31, 51 - 2 (6)
8 - 3 (7)
2, 29 - 4 (4)
10, 24 - 5 (13)
0, 41, 42 - 6 (5)
3, 27 - 7 (0)
10, 54, 60 - 8 (1)
42, 73 - 9 (15)
31 - 10 (8)
20, 28, 92 - 11 (14)
19, 90 - 12 (10)
19, 32, 96 - 13 (2)
20, 93 - 14 (9)
2, 31 - 15 (3)

이렇게 각각 1개에서 3개 정도의 값이 있습니다. (()안의 값은 함께 인자로 전달되는 값입니다.) 여기서 16개의 값들이 모두 연산한 결과가 0이 나온다면 다음으로 넘어가는데 

16개의 값을 이용하여 이러한 연산을 거쳐 v39에 값을 세팅합니다. 이 값은 0이 아니어야 하며 0이 아니라면 다음 연산으로 넘어갑니다. 

이 다음에는 이러한 부분이 있는데 이 부분은 각 배열의 원소가 홀수인지 짝수인지 판별하는 부분입니다. 짝수라면 다음 배열 원소로 넘어가고 홀수라면 

그 원소 값을 이용해 다시 v38을 연산합니다. 이렇게 16번 루프를 다 돌고 나면 

v39와 v38을 이용해서 다시 v39를 세팅하고 그 값을 3과 비교합니다. 그 후에 3이 아니라면 4와 비교하는데 사실상 이 부분에서 v39가 3이 되는 경우는 없으므로 단순히 4와 비교하는 것이라고 봐도 무방합니다. 만약 4가 아니라면 실패 부분으로 분기하고 4라면 

v38을 3과 비교하며 같지 않다면 실패하게 됩니다. 이 모든게 맞아 떨어지게 되면 성공 부분으로 분기하며 플래그를 출력해 줍니다. 위에서 구한 값들을 이용하여 맞는 값들을 찾아보면 성공 부분으로 분기하는 값들은 총 9개가 나오며 그 중 하나만이 정상적인 flag를 뱉어줍니다. 소스는 이 때 당시에는 밤을 새고 이 문제를 푼 거라서 정신이 오락가락 할 때 짠 소스라 많이 더럽고 좀 더 효율적인 방법을 생각하기가 힘들어서 16중 for문을 이용해 풀었기 때문에 소스는 올리지 않고 결과값만 올리겠습니다. 

9개의 값이 존재하며 이 중 두 번째 값으로 넣었을 때 정상적인 플래그가 나왔었습니다. 



Key : nullcon{d0n_f05ing_15_4rt_t0_l34rn}

'Write Up' 카테고리의 다른 글

2016 Sharif CTF Write-Ups  (0) 2016.02.07
HackIM 2016 Reversing - PrisonBreak  (1) 2016.02.01
HackIM 2016 Reversing - donfos  (0) 2016.02.01
HackIM 2016 Reversing - Pesudorandom  (0) 2016.02.01
HackIM 2016 Reversing - ZorroPub  (0) 2016.02.01
[2016 CAT HolyShield] Reversing - Who Am I?  (5) 2016.01.23
Name
Password
Homepage
Secret
2016.02.01 16:07


이번에는 300점짜리 두 번째 문제입니다. 역시 64비트고 IDA로 먼저 뜯어보면 

rand값으로 sleep을 하고 함수 내에서 막 연산한 값을 가지고 오고 난 뒤에 값을 입력받습니다. 입력받은 값을 다시 sub_400ea0함수에서 체크하고 md5해시를 구하며 막 반복문을 진행하다가 특정 값이 되면 빠져 나오고 해시를 비교한 뒤에 flag를 출력해 줍니다. 체크 함수를 보면 

복잡해 보이지만 어차피 올바른 입력값은 하나 이므로 저 함수를 그대로 가져와서 브루트포싱을 해 주면 입력해야 하는 값을 구할 수 있습니다. 디버깅을 통해 sub_400ea0함수에 함께 넣어주는 값들만 찾아서 브루트포싱 해 주면 됩니다.

이런 식으로 소스를 짜서 값들을 모두 구해 내면 됩니다. 앞의 몇몇 값을 구하다 보면 규칙성이 있는 것을 파악할 수 있고 그 뒤는 굳이 소스를 돌려보지 않아도 값을 알 수 있게 됩니다. 이렇게 해서 최종적으로 알아낸 값들은

32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 256 512 1024 2048 4096 8192 16384 32768 65536 128 256 512 1024 2048 4096 8192 16384 32768 64 128 256 512 1024 2048 4096 32 64 128 256 16 32 64 128 8 16 32 64 4 8 16 32 2 1

이렇게 되며 이 값을 모두 sleep함수가 nop으로 패치된 바이너리에 넣고 돌려주면 플래그를 얻을 수 있습니다.



Key : nullcon{50_5tup1d_ch4113ng3_f0r_e1i73er_71k3-y0u}

Name
Password
Homepage
Secret
2016.02.01 14:17


100점짜리 맨 먼저 푼 문제입니다. 64비트 바이너리고, IDA로 뜯어서 보면 

처음에 루프를 돌 카운트를 입력하고 루프를 돌면서 다시 값을 입력하는데 그 값들은 모두 seed와 xor하는데 쓰입니다. 그리고 그 seed는 

srand로 rand값에 쓰이게 됩니다. 그리고 rand로 나온 값들의 md5해시를 구하여 비교하고, 맞다면 flag를 출력해줍니다. 따라서 파이썬으로 브루트포싱을 돌려주면 md5에 맞는 seed를 구할 수 있습니다. 

위 소스를 파이썬으로 돌려주면 플래그를 얻을 수 있습니다.



Key : nullcon{nu11c0n_s4yz_x0r1n6_1s_4m4z1ng}

Name
Password
Homepage
Secret
2016.01.23 23:02


이번 CAT HolyShield에서 푼 리버싱 문제인데 가상화 문제였습니다. 풀 때 꽤 재미있었던 문제라서 좀 더 분석을 해 보고 이렇게 풀이를 올립니다. 먼저 실행 모습입니다. 

파일은 exe파일 하나와 dll파일 하나가 주어집니다. exe를 먼저 IDA로 열어서 보면 

이러한 부분이 존재하는데 분석하면 주어진 dll파일을 열어서 0x1E00영역에 입력한 값으로 덮어 씌웁니다. 헥스에디터로 원래 0x1E00부분을 보면 

Nice_To_Meet_You~~!!라는 문자열이 존재하는데 이를 입력 값으로 덮어 씌웁니다. 그리고 로드한 dll에서 checkfunc함수의 주소를 가지고 와서 인자로 넘겨주고 호출합니다. 그럼 이제 dll을 보겠습니다. IDA로 까 보면

이게 전부입니다. 처음에는 가상화 일 것이라고 생각을 못했었으나 분석을 하다보니 가상화임을 깨달았습니다.. 이 부분이 vcpu입니다. ebp-0x28에 있는 값이 가상 레지스터 veip이고, 그 veip에서 한 바이트 가상 opcode를 cl 레지스터에 가져와서 그 핸들러를 호출해 줍니다. 올리디버거에서 exe파일을 통해 dll파일을 로드할 때 디버깅 해 보려고 했는데 자꾸만 LoadLibraryW함수를 호출하고 나서 계속 Readable하지 않은 곳을 읽고 있다고 하면서 오류가 나고 프로세스가 죽었습니다..(혹시 이유를 아시는 분 계시면 댓글 남겨주세요!) 여기서 한 3시간동안 갈피를 잡지 못하고 헤메다가 그냥 직접 코드를 짜서 dll을 로드시켜보니 잘 로딩이 되더군요. 그래서 제가 직접 코드를 짜서 분석했습니다. 코드는 간단히 dll을 로드하고 checkfunc함수의 주소만 얻는 부분만 넣었으므로 소스는 생략하고 직접 디버깅 해 보겠습니다. 

올리디버거에서 Break in new module(DLL)옵션에 체크를 해 주시고 dll를 로드해 보겠습니다. 

잘 로딩이 되었고 이제 DllEntry주소에 브레이크 포인트를 걸고 실행하면 dll디버깅이 가능하게 됩니다. 

vcpu입니다.

가상화된 vcode입니다. 지금 vcode가 어떻게 이루어져 있는지 분석하기에는 분량이 너무 많고 다 분석을 한 부분만 설명하겠습니다.

먼저 vcode의 구조를 보면 첫 바이트는 opcode, 두 번째 바이트는 operand의 정보를 담고있는 operandinfo이고, 그 뒤는 opcode가 무엇이냐에 따라 각 operand의 개수와 크기가 가변적입니다. 

분석된 각 opcode의 기능들을 인텔 명령어에 비교하여 설명해 보면

01 - PUSH
    00 - 
PUSH reg[operand1]
    01 - PUSH reg[operand1]
    04 - PUSH reg[2]([ebp+8])
    08 - PUSH operand1
02 - MOV
    00 - MOV reg[operand1], reg[operand2]
    01 - MOV reg[operand1], DWORD:[reg[operand2]]
    21 - MOV reg[operand1], BYTE:[reg[operand2]]
    24 - MOV 
BYTE:[reg[operand1]], reg[operand1]

03 - SUB
    02 - SUB reg[operand1], DWORD:[operand2]
04 - MOV
    00 - MOV reg
05 - CALL
    04 - CALL reg[operand1]
06 - XOR

    00 - XOR 
reg[operand1], reg[operand2]
    24 - XOR BYTE:[reg[operand1]], reg[operand2]
07 - ADD
    01 - ADD reg[operand1], DWORD:[reg[operand2]]
    02 - ADD reg[operand1], operand2
    06 - ADD DWORD:[reg[operand1]], operand2
08 - XCHG
    00 - XCHG reg[operand1], reg[operand2]
09 - CMP
    00 - CMP reg[operand1], reg[operand2]
    01 - CMP reg[operand1], DWORD:[reg[operand2]]
    02 - CMP reg[operand1], operand2
0A - JZ
    08 - 
jmp veip + operand1
0B - INC
    00 - INC reg[operand1]
0C - JL
    08 - jmp veip + operand1
0D - JLE
    08 - 
jmp veip + operand1
0E - Exit
    00 - Exit vcpu to Dll Entry
0F - TEST
    00 - TEST reg[operand1], reg[operand2]
10 - JG
    08 - 
jmp veip + operand1
11 - POP
    00 - POP reg[operand1]
12 - JMP
    08 - jmp veip + operand1
13 - Exit Virtual mode

이렇게 됩니다. 01~13은 opcode이고 그 밑에 탭으로 띄어져 있는 것은 각 operandinfo에 따른 연산 방식의 차이입니다. 01 opcode(PUSH)에서 operandinfo 00과 01의 차이를 잘 모르겠고, 04의 역할이 애매하네요.. 

그리고 EBP를 기준으로 밑으로 가는 부분이 가상 스택, 위에 있는 부분이 레지스터 부분입니다. EBP+4는 EBP를 기준으로 VESP가 상대적인 값으로 들어있고(1, 2, 3과 같은 값들) EBP+24는 VEAX이며 EBP+4와 EBP+24 사이의 값들은 가상 범용 레지스터로써 쓰입니다. EBP+28은 VEIP이고 EBP+C는 veflags로 값이 0일 때는 비교한 앞의 값이 더 클 때, 1일 때는 같은 때, 2일 때는 더 작을 때 세팅이 됩니다. 그리고 10007028 주소에 LoadLibrary, GetProcAddress, VirtualProtect API의 실제 주소가 들어 있으며 vcpu가 Call을 할 때 이 값을 참조하여 호출합니다. 

이제 vcode가 어떤 식으로 진행이 되는지를 알아보겠습니다. 먼저 VIrtualProtect함수를 호출하여 암호화 되어 있는 Dll 소스들을 복호화 합니다. 그 후에 데이터 섹션에 있는 값들 역시 연산을 통해 복호화를 하는데 복호화를 하면서 아까 덮어씌운 입력 값 역시 함께 복호화가 되고 그 값을 checkfunc에서 미리 정해져 있는 테이블과 비교합니다. 

복호화 과정은 단순한데 먼저 네 글자 단위로 쪼개서 각 자리를 바꿉니다. ABCD 였다면 BDAC이렇게 자리를 바꾼 후에 세 번째 글자로 첫 번째, 두 번째, 네 번째 글자와 xor연산을 해 줍니다. 이렇게 4바이트 단위로 끊어서 연산을 한 뒤에 첫 번째 글자로 나머지 모든 문자를 xor해 줍니다. 그리고 그 값을 정해져 있는 Table과 비교합니다. Table은 

이렇게 되어 있으며, 역연산 코드는 

이렇게 짤 수 있고 실행해 보면

이렇게 키가 나오게 됩니다. 



KEY : He110_My_N@me_1s_KY!


가상화에 관한 자료는 http://ezbeat.tistory.com/338 여기서 볼 수 있으며 저도 이 자료로 공부했습니다.

| 2016.10.12 18:13 | PERMALINK | EDIT/DEL | REPLY
비밀댓글입니다
5unKn0wn | 2016.10.12 18:23 신고 | PERMALINK | EDIT/DEL
앗 감사합니다ㅋㅋㅋ 이 때 문제 재밌게 잘 풀었습니다. 이 문제 덕분에 가상화 분석에 대해서 좀 더 잘 접근할 수 있게 된 거 같아요!
| 2017.01.05 01:19 | PERMALINK | EDIT/DEL | REPLY
비밀댓글입니다
5unKn0wn | 2017.01.05 02:26 신고 | PERMALINK | EDIT/DEL
보냈어요!
| 2017.01.05 20:04 | PERMALINK | EDIT/DEL
비밀댓글입니다
Name
Password
Homepage
Secret
2015.10.17 15:14


이번에는 10번 문제가 늘 전통적으로 내려오던 무한 게싱이 아닌 새로운 아두이노 문제로 바뀌었습니다. 주어진 문제를 보면 

"1. 주어진 아두이노와 브레드보드, 부품들로 화면과 같이 설계하면 7-segment에 문제가 표시됩니다.
 2. 케이블선의 색은 화면과 같이 맞출 필요가 없습니다.
 3. 정답을 입력해서 맞다면 본 문제가 시작됩니다."

이렇게 나와 있습니다. 주어진 회로도를 보면 

이렇게 나와 있습니다. 이건 정말 완전 순 노가다 문제였습니다.. 다 연결했는데도 안되서 다시 다 뽑고 하는 등 열심히 노가다 하면 7-segment에 484F4d45가 연속적으로 뜨고 이를 아스키코드로 변환하면 HOME이 됩니다.


KEY : HOME

| 2016.09.19 14:45 | PERMALINK | EDIT/DEL | REPLY
비밀댓글입니다
5unKn0wn | 2016.09.21 15:11 신고 | PERMALINK | EDIT/DEL
제공된 아두이노에 직접 연결했습니다
끄아악 | 2016.09.21 08:46 | PERMALINK | EDIT/DEL | REPLY
위에댓글단사람인데 비밀댓글어떻게보는지모르겟네요...다시여쭤봐도댈까요 :>..
+ 검색해보니 운영자이외 비밀답글은 읽을수없다고나오네요!
5unKn0wn | 2016.09.21 15:11 신고 | PERMALINK | EDIT/DEL
앗 비밀글 풀었어요ㅠㅠ
1 | 2016.09.21 21:19 | PERMALINK | EDIT/DEL
헉감사합니다!!
Name
Password
Homepage
Secret
2015.10.17 14:48


이번에도 리버싱 문제입니다. 실행을 해 보면 

ID를 입력받습니다. 제 아이디인 5unKn0wn을 입력하면 잠깐 멈칫 했다가 종료됩니다. 그 사이에 아주 잠깐 con2.exe라는 파일이 생성된 뒤 다시 삭제됩니다. 바로 올리디버거로 열어서 동적분석 해 보겠습니다. 메인 함수부터 분석해 보면 

문자열들과 파일이 다 보입니다. con2.exe도 있네요. ID를 입력받고 난 뒤를 보면 

입력한 ID를 인자로 전달하고 어떤 함수를 호출합니다. 이 함수 내에서는 제가 입력한 ID를 가지고 

연산을 거친 뒤 이 문자열을 만들어 냅니다. 이 함수를 나오고 난 뒤에 이번에는 con1.exe, con2.exe등의 인자를 넣어주고 새로운 함수를 호출합니다.

함수 내에서는 자기 자신을 열어서 con2.exe실행파일을 만들어 냅니다. 

fopen으로 파일을 엽니다. 자기 자신에서 

새로운 실행파일을 읽어 들입니다. 이렇게 해서 con2.exe를 생성합니다. (사실 헥스에디터로 열어서 보면 con1.exe파일 끝에 새로운 실행파일이 하나가 더 붙어있습니다.) 그리고 생성된 exe파일에 아까 입력한 ID로 만든 문자열을 인자로 넘겨주어 CreateProcess함수로 프로세스를 다시 만듭니다. 

스택의 상태를 보면

이렇게 인자가 들어가 있습니다. 이렇게 프로세스를 만들고 con1.exe의 역할은 끝났습니다. 이제 우리는 con2.exe를 분석하면 됩니다. 

con2.exe는 실행해도 아무것도 뜨지 않습니다. 

그리고 UPX가 걸려 있으므로 풀어주고 분석해 보겠습니다. 

먼저 메인을 분석해 보면 우선 인자가 2개이어야 합니다. 하지만 올리디버거에서는 인자를 넣어서 실행할 수가 없습니다.(혹시 있다면 방법을 알려주세요!)(밑에 댓글에서 방법을 찾았습니다.) 그래서 임의적으로 인자로 들어가는 argc와 argv를 직접 패치해서 인자를 넣어줍니다. 

argc를 수정하고 

argv를 넣어줍니다.

그리고 키를 생성하는 함수를 호출합니다. 

함수 내부에서 이렇게 키를 만드는 루틴을 지나고 나면 

키가 생성이 됩니다.


KEY : bd6B66f6bd

Mini 5kyc1ad | 2015.10.17 16:38 신고 | PERMALINK | EDIT/DEL | REPLY
Ollydbg에서 인자를 넣는 방법을 태양이가 모를줄은 충격과 공포다.
Ollydbg 실행 뒤 폴더모양 아이콘 Open 클릭하면 밑에 Argument 칸 있어.
거기에 원하는 인자 넣고 Open하면 자동으로 들어가 ㅋㅋ
5unKn0wn | 2015.10.17 17:03 | PERMALINK | EDIT/DEL
오마이갓 지금까지 몰랐네요..ㅋㅋㅋㅋㅋㅋㅋㅋ
KSHMK | 2015.10.17 17:08 | PERMALINK | EDIT/DEL | REPLY
눈물
Name
Password
Homepage
Secret
2015.10.17 09:53


약간 미스크 비스무리한 문제입니다. 문제 내용을 보면 

이렇게 나와있습니다. 문제 파일을 보면 

ssdeep이라는 해시를 구하는 프로그램과 key_14라는 파일이 있습니다. 헥스 에디터로 열어서 시그니쳐를 보면 PK였습니다. 그래서 zip으로 바꾸고 다시 열면 key라는 파일이 또 튀어 나옵니다. 

저 파일을 다시 헥스 에디터로 열어보면 이번에는 시그니쳐가 

EGGA입니다. 살짝 고민하다가 확장자를 egg로 바꾸고 다시 여니 

key파일이 또 있었습니다. 이번에는 시그니쳐를 봤는데 

시그니쳐가 없었습니다. 여기서 약간 헤메다가 첫 번째 줄에 key.tar을 보고 확장자를 tar로 바꾸니 

이번에는 폴더가 나옵니다. 1~10이라는 파일이 있고 Hint.txt라는 파일도 함께 있습니다. 내용을 보니 

해시가 들어있습니다. 아까 본 ssdeep이라는 프로그램으로 1~10의 파일의 해시를 다 구해보니 6번 파일의 해시와 같음을 확인했습니다. 6번 파일을 헥스에디터로 열어보니 간단한 스테가노로 jpg파일 밑에 새로운 jpg가 붙어있었고 붙어있는 파일을 추출하니 

Turn off the light라는 문자열이 보입니다. 하지만 이것은 키가 아니었습니다. 여기서 포기하고 다른 문제를 풀 던 중에 명암을 조절하라는 힌트가 나왔고 포토샵으로 열어서 level값을 조절해 보니 

키가 나왔습니다.


KEY : Record Five Sin

'Write Up' 카테고리의 다른 글

정보보호올림피아드2015 본선 Q10  (5) 2015.10.17
정보보호올림피아드2015 본선 Q5  (3) 2015.10.17
정보보호올림피아드2015 본선 Q3  (0) 2015.10.17
정보보호올림피아드2015 본선 Q2  (2) 2015.10.17
Layer7 CTF Write-UP  (2) 2015.09.01
YISF 2015 Write-Up 예선  (0) 2015.08.12
Name
Password
Homepage
Secret
2015.10.17 09:28


리버싱 문제입니다. 문제 내용은 63빌딩을 오르면서 세 개의 키를 획득하면 올바른 최종 키가 나오게 됩니다. 실행시켜보면 

ID를 입력받습니다. 제 ID는 Player14였습니다. 입력하고 들어가서 엔터를 누르면

게임이 시작됩니다. Stage63까지 가면 키를 다 얻나 봅니다.

UPX가 걸려 있어 언패킹을 하고 IDA로 먼저 정적 분석을 합니다. 문자열을 보면 

익숙한 문자열들이 좀 보입니다. 여기서 Pass가 있는 부분으로 갑니다.

여기서 이 문자열을 사용하네요. 이제 이 함수를 올리디버거에서 동적 분석 해 보겠습니다. 

브레이크포인트를 걸고 온 뒤 분석을 해 보면

여기서 0x3F와 비교를 하는데 이는 십진수로 63입니다. 즉 저 변수가 몇 층인지를 저장하는 변수라고 볼 수 있습니다. 63과 같으면 아래 분기문에서 분기하지 않으므로 제로플래그를 수정하여 아래 호출하는 함수로 가 보겠습니다. 들어가 보면 0x402D20함수를 호출 하는데 이를 IDA에서 헥스레이로 보면 

총 세 개의 분기문이 있는 것을 볼 수 있습니다. 여기서 우리가 세 개의 키를 획득해야 한다고 했으므로 여기가 키와 관련된 부분이라 유추할 수 있습니다. 계속 반복해서 분석해 본 결과 각각의 if문이 하나의 키를 먹었을 때 실행되는 부분임을 알 수 있었고 각각의 분기문을 모두 실행시켜 주면 최종 키를 얻을 수 있습니다.

분기문을 수정하여 키를 획득했기 때문에 프로그램 상에서는 세 번째 키만 획득했다고 나오지만 실제로 나온 키는 첫 번째, 두 번째, 세 번째 키 모두 먹었을 때의 연산된 키 이므로 저 키가 최종 키 입니다.

KEY : 8Aq4Ce2Aq6Ky2Ik

'Write Up' 카테고리의 다른 글

정보보호올림피아드2015 본선 Q5  (3) 2015.10.17
정보보호올림피아드2015 본선 Q3  (0) 2015.10.17
정보보호올림피아드2015 본선 Q2  (2) 2015.10.17
Layer7 CTF Write-UP  (2) 2015.09.01
YISF 2015 Write-Up 예선  (0) 2015.08.12
[Just For Fun3] Reversing_AVReversing  (0) 2015.07.26
정보보호올림피아드 질문 | 2016.08.15 19:58 | PERMALINK | EDIT/DEL | REPLY
2016 정보보호올림피아드에 나가게 된 고등학생입니다 ㅎ
혹시 정보보호올림피아드 예선 문제 리버싱이 나오나요?
5unKn0wn | 2016.08.15 20:07 신고 | PERMALINK | EDIT/DEL
네네 예선에 리버싱 문제 나옵니다
Name
Password
Homepage
Secret
2015.09.01 19:49


아쉽게 고등부 4위를 했지만 와업 올려봅니다.


Layer7 CTF Write-Up.pdf



진짜 포너블 제대로 공부해야겠네요...

'Write Up' 카테고리의 다른 글

정보보호올림피아드2015 본선 Q3  (0) 2015.10.17
정보보호올림피아드2015 본선 Q2  (2) 2015.10.17
Layer7 CTF Write-UP  (2) 2015.09.01
YISF 2015 Write-Up 예선  (0) 2015.08.12
[Just For Fun3] Reversing_AVReversing  (0) 2015.07.26
[Just For Fun3] Reversing_Damnida  (0) 2015.07.26
direwolf | 2015.09.04 20:48 | PERMALINK | EDIT/DEL | REPLY
안녕하세요 풀이보던도중 궁금한점이 있어서 질문을하게됬습니다
meaningless 같은 문제는 layer7 서버에 접속에서 파일을 실행하는것인데 어떻게 ida와 연동하여 디버깅했는지 알수있을까요??
5unKn0wn | 2015.09.05 00:49 신고 | PERMALINK | EDIT/DEL
WinSCP라는 프로그램을 사용하면 서버에 있는 바이너리를 다운 받을 수 있습니다. 그리고 다운 받은 바이너리를 IDA로 분석하시면 됩니다. 감사합니다 :)
Name
Password
Homepage
Secret
2015.08.12 07:36


몇 일 전에 끝났던 순천향대학교 정보보호 페스티벌 YISF2015 풀이 올립니다. 


2015_YISF_문제풀이보고서_이태양.pdf


대회 도중에는 아쉽게 리버싱200 문제를 풀지 못했지만 끝나고 바로 풀었으므로 따로 풀이 올리겠습니다.

'Write Up' 카테고리의 다른 글

정보보호올림피아드2015 본선 Q3  (0) 2015.10.17
정보보호올림피아드2015 본선 Q2  (2) 2015.10.17
Layer7 CTF Write-UP  (2) 2015.09.01
YISF 2015 Write-Up 예선  (0) 2015.08.12
[Just For Fun3] Reversing_AVReversing  (0) 2015.07.26
[Just For Fun3] Reversing_Damnida  (0) 2015.07.26
Name
Password
Homepage
Secret