분류 전체보기
-
LEVEL 14 giant write-upSystem hacking training/Hackerschool LOB 2018. 5. 12. 19:45
bugbear -> giant 소스코드를 분석해보면 인자가 두개 이상인지 먼저 체크하고 맞다면 gain address of execve 부분을 통해서 execve()의 주소를 구해온다. 이 주소를 구하는 방법은 먼저 lib_addr에 libc의 base주소를 구하고, execve_offset에 execve()의 offset을 구하여 마지막 execve_addr에 lib_addr + (int)execve_offset을 하여 execve()의 주소를 구한다. 그리고 memcpy()를 이용하여 ret에 argv[1][44]의 값을 넣고 execve()의 주소와 같은지 확인한다. 다를경우 예외처리가 되고 같을 경우 strcpy()를 통해 bof가 터진다. 따라서 익스를 하기 위해서는 execve()의 주소를 a..
-
LEVEL 13 bugbear write-upSystem hacking training/Hackerschool LOB 2018. 4. 26. 01:54
darkknight -> bugbear [문제 + 힌트] 문제를 보면 bof는 터지지만 argv[1][47]의 값이 bf라면 예외처리가 되며 종료되기 때문에ret에 스택의 주소 말고 다른 영역의 주소를 적어야할것같다. 힌트 부분을 보면 알다시피 이 문제는 RTL을 이용하여 풀면된다. [Link - RTL 이란?] 페이로드는 `python -c 'print "A(dummy)" * 44 + "system() address" + "dummy 값" * 4 + "/bin/sh\00"'` 이런식으로 구성하면 된다. 이 페이로드를 작성하기 위해 준비물이 필요한데system()의 주소와 system()에 인자로 줄 /bin/sh\00가 필요하다. 그전에 이 바이너리가 static linked 인지 dynamic lin..
-
FPO (Frame Pointer Overflow)System hacking training/Knowledge 2018. 4. 26. 00:57
안녕하세요. FPO (Frame Pointer Overflow) 에 대해 포스팅을 시작하겠습니다. 먼저 FPO 란? SFP의 1byte를 overflow (overwrite) 하여 실행코드가 있는 원하는 주소로 eip 를 변조하는 기법입니다. 이를 학습하기 위해서는 함수 에필로그 과정을 이해하고 있어야하는데요. LOB golem의 문제를 예로들겠습니다. 이 바이너리에는 main()와 problem_child 라는 서브 함수가 있습니다. problem_child 함수에는 buffer[40]으로 버퍼가 40byte 할당됩니다.또 이 바이너리는 buffer가 40byte 할당되었지만 SFP가 1byte 오버플로우가 일어납니다. 본격적으로 에필로그에 대해서 알아봅시다. 함수 에필로그에는 leave 와 ret i..
-
LEVEL 12 darkknight write-upSystem hacking training/Hackerschool LOB 2018. 4. 22. 03:42
golem -> darkknight 오늘은 golem을 풀이를 작성해보겠다. [문제 + 힌트] 문제를 보니 main()에서 하는 일은 인자가 2개 이상인지 검사하는 일뿐나머지의 처리는 problem_child()에서 처리한다. 그리하여 problem_child() 를 보니 기존의 bof 와는 다르게 strncpy()를 이용하여 입력의 길이를 제한했는데 buffer 는 40byte임에 불구하고 41byte 입력을 받을 수 있게 설계가 되어있다. 따라서 SFP의 하위 바이트 1byte를 Overflow(Overwrite) 할 수 있다. 그래서 뭘 할 수 있을까 생각하던 중 힌트 부분의 FPO가 보인다. FPO에 대해 알아봤는데 결정적인 힌트였다. FPO 란? ==> [Link] Frame Pointer Ov..
-
LEVEL 11 golem write-upSystem hacking training/Hackerschool LOB 2018. 4. 20. 05:47
skeleton -> golem 오늘은 golem에 대해 풀이를 하였다. 문제는 답정너였는데 풀이하는데 꽤 애먹었다. [문제 + 힌트] 문제를 보면 딱 답정너라는걸 알 수 있다. 역시 지금껏 풀어왔던 문제처럼 쉘코드를 어디에 넣을지...가 관건이다. 먼저 if(argv[1][47] != '\xbf') 일때 예외처리가 되면서 exit(0)로 바이너리가 종료된다. 따라서 스택에 쉘코드를 올리고 return 해야된다. 그런데 stack destroyer! 부분을 보면 ret 하기 전에 memset()로 buffer와 ret (buffer+8) 보다 높은 주소의 모든 스택을 0으로 세팅하는것을 확인할 수 있다. 그렇다면 남은 공간은 스택의 낮은 주소가 있다. 이해를 위해 그림을 그려보면 현재 스택은 이러한 형태..
-
x64 BOF(Buffer Overflow)System hacking training/Knowledge 2018. 4. 18. 20:32
오늘은 x64 즉 64 bit 환경에서의 buffer overflow에 대해 포스팅하겠습니다. 먼저 x86 vs x64에 대해 선행 지식이 필요합니다. 바이너리 하나를 받았는데 이제서야 풀이해보네요.ㅠ 먼저 바이너리를 확인해보겠습니다. char buffer가 256 byte로 할당되었지만 gets()의 사용으로 인해 bof가 터집니다. gets()는 NULL문자가 오기전까지 모든 문자열을 입력받는데 바로 여기서 ret 를 침범하여 우리가 원하는 shell()를 실행할 수 있습니다. 이전의 x86 bof 문제에서 처럼 payload를 구성해보면 [x86 payload] python -c 'print "A"*256+"SFP(4)"+"ret(4)"' 이렇게 buf 를 의미없는 문자로 덮어주고 SFP를 4byt..
-
[2018] 11th CODEGATEfkillrra ?/conference 2018. 4. 11. 17:10
2018 codegate CTF를 광탈하고 컨퍼런스를 다녀왔습니다. 이번에는 Open CTF 와 각종 부스를 즐기고 왔는데요. 1년전 codegate conference를 다녀왔을때와 비교하면서 현타를 느끼고왔습니다. 먼저 상을 받아왔는데요 ㅎ 영상 시연 공모전을 한다는 얘기를 듣고 바로 프로젝트를 시작했는데 이렇게 좋은 결과가 있을지는 몰랐습니다. 영광이네요.ㅎ 이 영상은 시연영상 부스에서 볼 수 있었습니다. 신기하더군요.ㅎㅎ 사실 이렇게 놀다와서 발표내용은 잘 기억이 나지 않습니다.ㅠ 내년에는 꼭 CTF 본선에 진출해보고싶네요..ㅎ