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 |