본문 바로가기
# write-up/- ctf

[RC3 2016] - Reversing 200pt

by ddddh 2016. 11. 21.


http://blog.naver.com/yheekeun/220867134574


같은 팀 yokkkkk님의 풀이




Reversing

 -f1ay.yokkkkk



[그림 1] main

 

main은 이렇게나 간단하다.. memcpy(flag, enc(입력값), 0x23) 해서 일치하면 정답이다.



 

[그림 2] enc 내부

 

내가 입력한 값을 d,a,d,?로 차례대로 암호화 시키는 것이다.

 

복호화 소스를 짜보자

 

[그림 3] 복호화 소스

 

 

[그림 4] sol

내가 찾고자하는 플레그가 아니라고 한다...

 

엄청난 삽질 끝에,

 

 

 

[그림 5] 바이너리 끝

 

FLAG가 뒤집혀 들어가있는 것을 알 수 있다그리고 문제이름도 elf의 반대인 fle이다.

바이너리를 뒤집어보자

 

[그림 6] 뒤집기

 

 

 

[그림 7] 수정

 

fix_fle 파일 내부인데 ELF 헤더 시그니쳐를 입력해주자

 

 

 

 

 

[그림 8] 정상 실행

 

제대로 된 바이너리 파일을 찾았단다.

 

 

[그림 9] syscall

syscall로 값을 입력을 받고 0x1F 길이를 비교한다즉 입력값이 0x1f

 

 

 

[그림 10] 연산 루틴

 

byte_8048000-0x8048000 부분에 내가 어떠한 바이너리와 내가 입력한 값을 xor연산하여 넣는다.

 

 

 

 

[그림 11] 체크 루틴

[그림 10]에서의 루틴이 완료 되면 왼쪽으로 넘어와서 체크루틴 sub_804804c 가 실행되고,

eax가 0이라면 offset word_80481c2 부분의 바이너리를 0x55와 xor하여 완성된 성공 구문을 출력 시켜준다.

 


[그림 12] sub_804804c 체크루틴

 

설명하자면 [그림 10]에서의 연산루틴을 거친 것과 비교를 하는 것을 알 수 있다.

동적분석을 통해 확인해보면 0x1d만큼 반복문을 돌리며 sub bl, [edx]에 의해 값이 같으면 eax에 0이 더해지고 다르면 eax의 값이 올라가므로 전부 일치하게되면 eax가 0이되어 correct문을 띄우게 된다.




[그림 13] 내가 입력한값과 연산

빨간색과 내가입력한 값이 xor연산되어 나중에 어떠한 바이너리값과 비교하게된다.

 



어떠한 바이너리값은 아래와 같다.(그림 11. 0x8049bcc-0x8048000의 file offset)


[그림 14] 바이너리

 

 

 

[그림 15] 복호화 소스

[출처] RC3 CTF - FLE (200)|작성자 헤헤

[출처] RC3 CTF - FLE (200)|작성자 헤헤

'# write-up > - ctf' 카테고리의 다른 글

[Plaid CTF 2017] no_mo_flo  (0) 2017.04.27
[ALEX CTF] RE5: packed movement  (0) 2017.02.07
[RC3 2016] 메모리 포렌식 - 500pt  (0) 2016.11.27
[RC3 2016] - Reversing 350pt  (0) 2016.11.21
[RC3 2016] - Reversing 100pt  (0) 2016.11.21