본문 바로가기

공부는 계속 ../Pwnable Writeup

(12)
DEFCON CTF Qual 2017 beatmeonthedl 이 문제는 좀 다양한 풀이법이 존재하는거 같다. 다른 방향으로 풀어보면 공부가 엄청 될거같다. (다만 난 아직 한 가지 방법으로밖에 풀지 못하겠다 ㅠ) 파일 자체에는 glibc malloc 의 보호기법이 들어가지 않았지만, how2heap 에서 제시했던 unsafe unlink 취약점을 이용해서 문제를 풀어보았다. 애초에 그렇게 풀라고 힙 포인터를 bss에 둔 것도 어느정도 고려한거 같다. 다른 사람들 풀이를 보니 참 다양하게들 푼거 같은데... 아직 그들의 풀이가 눈에 빠르게 들어오지는 않는다.. 언젠간 모든 풀이가 보이는 날이 오겠지? 풀이를 진행한다. 1. Chunk에 Overflow가 발생한다.2. Chunk를 포인팅하는 전역 변수(reqlist)가 있다. 그렇다면 unsafe unlink를 이용..
2014 hitcon stkof (unsafe unlink) 그동안은 패치되기 전의 unsafe unlink 만 공부해왔다면 이제는 패치된 후의 unsafe unlink 를 풀어보도록 한다. (얼떨결에 이런 문제가 얻어걸려서 공부하기 좋은 기회라고 생각한다.) how2heap 의 usnafe unlink 에 대해서 공부를 한 뒤에 문제를 풀어봐야겠다. how2heap 에 너무 자세하고 예술일 정도로 잘 나와 있으므로 문서를 좀 정리해봐야겠다. https://www.lazenca.net/display/TEC/unsafe+unlink 여기 문서에 너무나 자세히 설명해 있다. (꼭 정독하기 바람 두번 세번) http://code1018.tistory.com/195 여기도 같이 참고하면 좋을거 같다. 전체적인 Exploit plan 은 다음과 같다. 다음과 같은 방법으로..
defcon 2014 Baby_first_heap 오랜만에 포스팅을 한다. 데이큰 2014 워밍업 문제였는데, 엄청 쉬운 문제이다. (풀고보니 이거 풀기전에 Double FreeBug 완벽한 이해가 좀 필요할듯..) 힙 주소까지 모두 알려줘서 릭할 필요조차 없다. 아직 힙 구조에대해서 익숙하지 않고.. 또 몇일 보지 않았더니 unlink가 헷갈렸다. 이전 것을 좀 복습해야겠다. 근데 free함수를 보면 fd+8=bk 는 어디에 나오는거지??-> IDA로 보면 알 수 있음 어셈블리로 보면 fd+8 = bk, bk+4 = fd 해주는것을 볼 수 있음 또 왜 260짜리 청크 다음 청크의 PREV_INUSE 값을 1로 바꾸는거지.. 디버깅을 해보자 내일 ! -> 디버깅을 해봐도 모르겠고.. 나름대로 정리해본 결과 fake_chunk를 [260]청크 다음 넣어 ..
heap 문제 풀이 목록 defcon 2014 baby's first heap (완료) hitcon ctf 2014 stkof defcon CTF 2017 beatmeonthedl ---------------------------------------- 3.21 0ctf 2017 babyheap 이 외에도 hose of 시리즈도 공부해보아야겠다. 일단 https://www.lazenca.net/display/TEC/unsafe+unlink 여기 자료를 먼저 참고하고.. 내가 이해한 방식대로 다시 여기 정리하려고 한다. 3월까지 하우스 오브 시리즈를 다 볼 수 있을까?
Codegate 2017 messenger ezhp 과 비슷한 문제라길래 풀어본다. 64비트인거 빼고 완전 똑같다고 보면된다. 다만 다른점은 힙을 2개밖에 할당할 수 밖에 없고 그 사이즈 또한 32바이트로 제한되어있다. 실험) 2개의 메시지를 임의로 생성하고 "A*31", "B*31" 를 입력한 모습 ([heap]에 실행권한도 있음) 뒤에 \x0a 개행이 붙은것을 확인 가능 힙 메모리를 보니 malloc_chunk에 힙 메모리 주소가 적혀있는 것을 확인할 수 있다. 구조를 좀 생각해보면.. 힙 주소가 시작하는 부분부터 한 개의 chunk : | 8byte : ? | | 8byte : size | | 8byte : fㄱd | | 8byte : bk | | 32byte : data | | 8byte : ? | 힙 주소도 막 적혀있고 그러는데... 이..
Plaid CTF 2014 ezhp Double Free bug 공부 이후 처음 풀어보는 Heap overflow CTF 문제이다. 바이너리를 어느정도 분석해보면 알수있듯이, 예전버전의 glic때 썼던 free 알고리즘을 사용한다. 하지만 그때와는 다르다. free를 하지 않아도 fd, bk 가 존재했고, 또 다른 점은 unlink()시 bk+4 = fd, fd +8 = bk 가 들어간다. (2번째 함수 참조) fd, bk 검증 구문도 따로 없어서 힙 익스 연습용으로 적합하게 제작된 문제로 보인다. 문제의 풀이는 요기 블로그를 참조했다.. 아직은 혼자 풀 실력이 안됨.. write-up 참조.. (http://nextline.tistory.com/104 ) 왜 두 번째 청크의 prev_size, size 의 값을 0xffffffff, 0x..
Protostar heap3 Double free bug 를 이해하고 가장 쉽게 접근할 수 있는 문제.. 문제 환경은 아주 예전의 취약한 glic 버전을 사용하고 있기에.. 해당 사이트에서 제공하는 iso 로 진행해야 한다. 문제 소스코드는 다음과 같다. 1234567891011121314151617181920212223242526272829#include #include #include #include #include void winner(){ printf("that wasn't too bad now, was it? @ %d\n", time(NULL));} int main(int argc, char **argv){ char *a, *b, *c; a = malloc(32); b = malloc(32); c = malloc(32); ..
Double Free Bug 이제 heap overflow 에 관련해서 공부를 해볼까 한다. heap 에 대한 공격은 여러가지가 있다. 그 중 제일 기본이 되는 Double Free bug 참조 : http://smleenull.com/586 여기나온 블로그 문서가 제일 올바르게 작성되었다. (다른 곳은 좀 이해하기가 너무 어려움.. 사실 이해할 수가 없다고 해야함) smleenull 블로그 문서를 보면 대부분 이해가 될것이지만, 아래 부분에 대해서는 조금 추가 설명을 진행해야 되겠다. -> 특히나 chunk size 를 구하는(and 0xfffffffc) 매커니즘을 설명해놓은 문서는 여기밖에 없음 (위 그림에서 '다음 청크 포인터 + 다음 청크 사이즈' 를 변경 => '다음 청크 포인터 + 다음 청크 사이즈 + 4') 이제 위 정..
Codegate 2017 - babypwn 도라애몽, Nuclear 보다 훨씬 쉬웠던 문제이다. 버퍼를 출력해주는 구문에서 버퍼와 연관된 카나리를 바로 출력할 수 있었으며, system 함수도 사용하고 있어서(IDA 및 elfsymbols 확인) 바로 rop 공격이 가능하였다. 123456789101112131415161718192021222324252627282930313233343536#!/usr/bin/pythonfrom pwn import *context(arch='x86', os='linux', endian='little') e = ELF('./babypwn')rop = ROP(e)ip = 'localhost'port = 8181 #leak canaryr = remote(ip, port) print r.recv(4096)r.send('1..
Codegate 2014 Nuclear Angry doraemon 과 비슷한 rop 문제이다. pwntools 를 이용해서 좀 쉽게 풀었다. 근데 pwntools e.symbols['send'] - e.symbols[system] 이 약간 오류가 있는거 같다.. 그냥 gdb 상에서 구하는게 좋을거 같다 gdb-peda$ p send$3 = {} 0xf7f9d500 gdb-peda$ p system$4 = {} 0xf7e12da0 gdb-peda$ p send-system$6 = 0x18a760 nuclear의 취약점은 start_routine에서 사용하고 있는 recv() 에서 발생한다. 버퍼의 크기는 0x200 인데, 0x512 만큼 받아버리니.. 아마 개발자 실수인것 같다 (0x200은 10진수로 하면 512) 처음에 passcode를 요..