목록CTF's (38)
ipwn
tamuCTF에 pwn1 ~ 5번까지 전부 All Clear했다. 이따가 라업을 써서 올려야겠다. 솔직히 난이도가 너무 쉽기는했지만, 재미있었다. ㅋㅋ 전부 stack문제였고, pwn외에도 여러 가지의 문제들도 풀어봤는데, 일단은 포너블 실력을 꾸준히 키워야겠다.. 리버싱이랑 포너블이랑 크립토 전부 잘하고싶다.. 잘하는 사람들 너무 멋있다.
제목대로 일단 본선에 진출했다. 예선 결과가 많이 아쉽긴 했지만, 그래도 본선 메일이 날라오니 기분이 엄청 좋아졌다. 아마 이제 곧 페이스북에 공지가 될 것 같다. 덩달아 영재원도 같은 날 합격했다고 공지돼서 기분이 엄청 좋았다. 본선에서 수상하는 건 많이 어렵겠지만, 한 문제라도 풀 수 있도록 노력해야겠다. 일단 앞으로는 학교 내신도 챙기고, 해킹 공부도 틈틈히 할 수 있도록 해봐야겠다. (이 기세를 몰아 공부를 열심히 해서 BOB도 되면 엄청 좋겠다.)
드디어 코드게이트 2018이 진행됐다. 결론만 말하자면, 공식적으로는 아직 본선 확정 안나서 모르겠지만 순위권에 오르지 못했다. 즉 예선 탈락이다. (추가 합격이 난다면 모르는 얘기겠지만) 결과가 이렇게 나서 솔직히 나 자신에게 좀 화도 많이 났다. 동점자가 많아서 빨리 풀었으면 충분히 20등대 초반으로 본선 가는 상황에서 쓰잘대기 없는 걸 하느라 7시간을 날려먹기도 했고 대회 끝나고 한 문제 더 풀었는데 일찍 풀었으면 10등대 초반으로 본선이었는데 푼 시간이 딱 9시 10분인 것도 그랬고.. 푼 문제는 겨우 2문제이다..ㅠㅠ 그러니까 결국에는 모든게 내 실력이 부족한 탓이다... 포너블 문제 최대 난이도가 ROP였다고 들었는데, (사실인지는 모르겠음) ROP만 주구장창 공부해놓고 왜 제일 쉬운 문제에서..
이번에 푼 문제는 luckyzzang 문제다. 바로 보호기법부터 확인해보겠다. NX는 걸려있지만 canary는 걸려있지 않다. 그렇다면 IDA로 한 번 분석해보겠다. port 7777번으로 nc를 열어준다. (ssh 포트를 7777로 바꿨었는데 이거 때문에 다시 바꿨다...) 한 번 접속해서 뭐하는 프로그램인지 알아보자. MSG를 입력하고 바로 끝을 낸다. 간단한 ROP문제일듯 하다. 다시 분석해보도록 하겠다. 연결이 성공적으로 된다면, Client has connected successfully :)라는 문자열을 바이너리를 실행한 화면에 띄워준다. 그리고 여기서 BOF가 터지는 것을 알 수 있는데 v2 % 100의 값이 적당히 커줘야 성공적으로 ROP를 실행할 수 있을 것이다. 최대 0x401 + 10..
이번에 풀 문제는 CODEGATE 2014 출제 문제인 nuclear이다. 난이도는 생각보다 크게 어려운 편은 아니었던 것 같다. 가장 먼저 이 문제를 풀기 위해서는 THIS_IS_NOT_KEY_JUST_PASSCODE파일이 필요하다. 파일 안의 내용은 대충 친구한테 적어달라고 했다. 바로 보호기법을 확인해보자. NX가 걸려있지만 canary가 걸려있지않다! 귀찮게 leak하는 과정을 거칠 필요가 없어진 것 같다!! IDA로 분석해보자. 일단 포트는 1129로 실행된다. 한 번 바이너리를 실행시켜 보겠다. ??? 뭐 하는 프로그램인지 도무지 모르겠다. 한 번 IDA로 분석해보겠다. 123456789101112131415161718192021222324252627282930313233343536373839..
이번 문제는 CODEGATE 2017에 나왔던 babyMISC문제이다. github.com/ctfs에서 찾아보니 pwn분야에 들어가있었는데 그냥 말그대로 MISC인 것 같다. 난이도도 생각보다 꽤 쉬웠다. 바로 IDA로 코드를 분석해보겠다. main함수에서 stage별로 함수를 호출하는 것 같다. 바로 함수들을 첫 스테이지부터 확인해보겠다. 일단 s의 문자열은 bash64로 encoding이 되어있고, scanf으로 입력을 받는다. 그리고 입력받은 문자열과 s는 달라야하고, 둘의 길이는 같아야 한다. 이건 base64 충돌을 이용하면 간단히 해결할 수 있는 문제이다. 맨 마지막 g부분을 h~j로 바꿔주거나, =부분을 A로 바꿔주면 스테이지가 통과된다. 2스테이지는 input을 두 개 입력받는다. 첫 번째..
이번에 푼 문제는 CODEGATE 2014에 나왔던 문제인 angry_doraemon이다. checksec를 이용해서 바이너리에 어떤 보호기법이 걸려있는지 확인하겠다. NX와 canary가 있는 것을 확인할 수 있다. 이제 바로 IDA로 분석하겠다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061void __cdecl __noreturn main(){ int optval; // [esp+28h] [ebp-C8h] socklen_t addr_len; // [esp+2Ch] [ebp-C4h] int v2; // [esp+30h] [ebp-C0h] int ..
이번에 푼 문제는 babypwn 문제이다. 작년 CODEGATE 2017에 출제됐던 문제이다. 여담이지만 이번 CODEGATE본선에 꼭 진출하고싶다.. 늦은 감이 없지않아 있긴 하지만.. 아무튼 IDA로 바로 babypwn 바이너리를 분석해보겠다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657unsigned int __cdecl main(int a1, char **a2){ socklen_t addr_len; // [esp+20h] [ebp-30h] int optval; // [esp+24h] [ebp-2Ch] int v5; // [esp+28h] [ebp-28h]..
이번에 풀 문제는 rop입문으로 유명한 PlaidCTF의 ropasaurusrex이다. 이 문제는 말그대로 rop로 해결하는 문제이다. 일단 어떤 행동을 하는 binary인지 확인해보자. 123pwndbg@ubuntu:~/tmp$ ./ropasaurusrex asdfghjklWIN 실행하니 갑자기 내가 이겼다고 한다. 음 감이 안온다. 한 번 ida로 까보자. 알고보니 어떤 함수를 실행시키고 그냥 win을 출력해주는 코드였다. 그럼 저 함수에 취약점이 있을 것이다. 한 번 저 함수를 살펴보도록 하겠다. 보아하니 buf공간이 0x88의 크기만큼 할당이 되어있는데, 0x100만큼의 입력을 받는다. 여기서 Buffer Overflow가 발생한다는 것을 알 수 있다. 그렇다면 공간은 | buffer(136) |..
음... 사실 이 문제는 WriteUp을 쓸지 말지 고민을 좀 하긴 했는데 그래도 푼 문제이니 쓰도록 하겠습니다. deasiestone 이 문제도 역시 MISC 문제였습니다. 배점은 보시다시피 10점으로 매우 쉬운 문제였습니다. 사실 사진을 보자마자 감을 잡으신 분도 계실 것 같지만, 이 문제는 -는 0으로 +는 1로 바꿔서 4byte씩 아스키코드로 바꿔주는게 플래그의 전부였습니다. 저는 이 문제를 마지막까지 못 풀어서 끙끙대다가 설마 2진수겠어? 했는데 정말 2진수더군요.. 코딩을 해서 0과 1로 분리, 저기에 나온 2진수들을 아스키 문자로 바꿔서 보면 !takem3D0wnt0thep4R4DIS3c1ty! 가 나오게 되며 이 말은 즉 h4c{!takem3D0wnt0thep4R4DIS3c1ty!}가 플래..