본문 바로가기

Write Up

YISF 2017 예선 Write-Up 이번엔 뮤쀼로 참가했다.Web - 50, 100, 150, 200 Forensic - 50, 100 Reversing - 50, 100, 150, 200 Pwnable - 50, 100, 150, 200 Misc - 50, 100, 150, 200리버싱 300 바이너리랑 풀이 코드 https://github.com/5unKn0wn/ctfs/tree/master/yisf2017/reversing300리버싱 300 가상화 문제라서 오래걸릴 줄 알고 안풀었는데 분석 해보니까 xor만 하는 생각보다 간단한 가상화였다. 더보기
ASIS CTF Quals 2017 Reversing Flour It was written in Korean 문제들 중에 배점이 두 번째로 낮았는데 푼 사람이 제일 적고 가장 어려웠던 문제입니다ㅠㅠ파일을 받아보면 일반적인 PE나 ELF같은 포맷이 아닌 이렇게 알수 없는 형태로 파일이 구성되어 있습니다. 맨 첫줄을 구글에 검색해보니.hex라는 확장자를 가진 파일이며 아두이노 같은 avr 환경에서 쓰이는 바이너리임을 알았습니다. 다시 검색해보니 Intel HEX라는 포맷이었습니다. 다시 검색을 통해 objcopy를 이용해서 hex파일을 elf파일로 변환할 수 있다는 것을 알았습니다. (objcopy가 elf32-avr 타겟을 지원해야 합니다.)"objcopy -I ihex Flour_d550ed0eb751b1da2b2bdfeeb1fe60ae213e77e8.hex -O e.. 더보기
YISF 2016 본선 리버싱 문제 풀이 올해 8월 즈음에 열렸던 순천향대 정보보호 페스티벌 본선에 출제되었던 리버싱 문제를 대회 도중에 풀지 못하여 나중에 풀어야지 생각했다가 풀어서 풀이 올립니다.분야는 윈도우 드라이버 리버싱이며 정적분석과 windbg로 커널디버깅을 통해 직접 동적분석해서 풀었습니다.주어진 바이너리는 exe이며 내부 리소스에서 sys파일을 바이너리가 직접 추출해줍니다.507284b27c265f829adcdc56409200bd.sys라는 파일을 생성하고 서비스를 생성, 시작한 뒤 패스코드를 입력받고 DeviceIoControl로 전달하는 것처럼 보이나드라이버를 직접 보면 실제로는드라이버 자체에서 직접 입력을 받고 있습니다. 이 때는 아스키 코드가 아닌 스캔 코드가 반환되므로 문제를 풀 때 유의해야 합니다.exe를 보면 패스코드.. 더보기
2016 Whitehat Contest 예선 Write-Up 2016 Whitehat Contest 예선 NYAN언더바CAT Write-Up입니다. 더보기
2016 Layer7 CTF Write-UP 라업입니다. 닉네임은 "양파가 송송" 사용했습니다. 더보기
YISF 2016 예선 Write-Up Algorithm - 50, 100, 200 Crypto - 50 Forensic - 50 Misc - 50 Pwnable - 50, 100 Reversing - 50, 100 더보기
2016 KDMHS-CTF times 200점으로 나온 리버싱 문제이다. 새벽에 나와서 별로 풀 의지가 다들 없었던거 같다ㅠㅠ IDA로 까보면argv[1]로 플래그를 전달받는다.그 다음 이 부분을 보자. 먼저 타임스탬프를 가져와서 srand넣어주고 dword_804B060와 xor하는데 dword_804B060를 seed라고 하자.seed를 타임스탬프와 xor하고 순차적으로 rand()값을 0xffffff, 0xffff, 0xff로 나눈 나머지와 xor 해 주고 그 밑에서 막 쉬프트 연산을 해 준다. 많은 분들이 이 부분에서 아 이게 뭐야 하고 걍 닫았을 거라고 생각하는데 이 부분은 그냥 더미에 불과하다. 이거를 디버깅 해 봤다면 알 수 있었을 텐데 이 구간을 좀 더 간단하게 표현해 보면, 처음 seed값이 0x12345678이라고 하면 s.. 더보기
2016 ASIS CTF Quals - firtog 포렌식 문제이다. 맨 처음 나온 리버싱이 너무 안풀려서 잡아본 문제이다. 파일은 패킷 파일이 주어진다. 네트워크 같은거 잘 몰라서 내부에 어떤 파일들이 있나 봤더니 zlib 파일들이 많이 있었다. 그래서 다 추출해 보았다. 123456file = open('firtog.pcap', 'rb').read().split('\x78\x9c') data = ''for i in range(1, len(file)): data += ('\x78\x9c' + file[i]).decode('zlib')open('decypted', 'wb').write(data)cs이렇게 파이썬 소스를 짜서 추출하면 된다. 추출된거 보면 막 이상한 것들이 많다. 페이크 플래그도 있고 막 파이썬 소스도 있고 했는데 추출된 데이터의 밑쪽을 보.. 더보기
2016 ASIS CTF Quals - Catch Me! 대회 전체적으로 리버싱이 상당히 어렵게 나왔다.. 5문제 나왔는데 최종적으로는 이 문제 하나밖에 못풀었다. 아무래도 리버싱 문제를 풀 때 인내심이 약간 떨어진 것 같다. 본선 올라갔으니까 본선 문제는 빡세게 제대로 잡고 다 분석하겠다는 마음으로 풀어봐야겠다. 이 문제는 x64 elf 바이너리이고 xmm 레지스터를 이용한 연산을 많이 한다. main함수의 코드는 이게 다이다. sub_400820의 함수 리턴값은 항상 0xB11924E1로 같으므로 크게 신경쓸 것은 없다. 그 후에 이 값들을 이용해서 0x6012A8부터 네 바이트 값을 만들어 내고 ASIS와 CTF 환경변수의 값들을 가져와서 CTF 환경변수의 값과 0xB11924E1 이 값을 xor했을 때의 값이 0xFEEBFEEB이면 ASIS 환경변수에 .. 더보기
2016 CodeGate Final rev 두 명 푼 250점 리버싱 문제입니다. 64비트 ELF이고 Go언어로 작성된 프로그램 입니다. 일단 실행시켜 보겠습니다.막 good good wrong wrong 출력하고 끝납니다. 모두 good이 나오는 키를 찾으면 될 것 같습니다.먼저 IDA로 까 보겠습니다. Go는 언어 특성상 헥스레이가 안되기 때문에 순 어셈만 보고 분석했습니다.먼저 입력을 받고 길이 체크 후에 메인 체크 루틴으로 넘어갑니다.길이는 15글자 이상이어야 합니다. 후에 메인 체크 루틴으로 넘어가면 그래프뷰 보고 쫄았지만 디버깅 하면서 분석하니까 크게 힘들지는 않았습니다.먼저 스트링의 첫 번째 글자와 마지막 글자를 가져와서 비교합니다. 만약 같다면 wrong을 출력합니다. 그 다음으로 첫 글자와 끝 글자가 숫자/알파벳 범위에 없고 합이.. 더보기