풀이
-
LEVEL 17 succubus write-upSystem hacking training/Hackerschool LOB 2018. 5. 17. 20:42
zombie_assassin -> succubus 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394[zombie_assassin@localhost zombie_assassin]$ cat succubus.c/* The Lord of the BOF : The Fellowship of the BOF - succubus - calling functions continuously */ #include #include #include // the ..
-
LEVEL 16 zombie_assassin write-upSystem hacking training/Hackerschool LOB 2018. 5. 13. 17:09
assassin -> zombie_assassin 소스코드를 분석해보면 힌트부분에 FEBP라는 중요한 힌트가 있다. Fake EBP라는 기법을 이용하면 풀릴것같다. 인자는 2개 이상이여야하고, argv[1][47]이 이전 문제와 동일하게 \xbf, \x40이면 예외처리가 된다. 그리고 strncpy()로 buffer에 argv[1]의 값을 48개 받기 때문에 bof가 터진다. 이 문제의 의도에 맞게 Fake ebp 기법을 이용하여 문제를 풀면된다. Fake ebp에 대해서는 자세하게 따로 다루기로 하고 페이로드를 짜는 요령만 먼저 익혀보자. 사실 Fake ebp 는 FPO와 매우 유사하기 때문에 풀이가 쉬웠다. 먼저 페이로드의 구성은 다음과 같다. `python -c 'print "dummy(4byte)..
-
LEVEL 15 assassin write-upSystem hacking training/Hackerschool LOB 2018. 5. 13. 15:37
giant -> assassin [문제 + 힌트] 소스코드 먼저 분석을 해보면 argc가 2이상 즉 인자값이 2개 이상이여야하고 argv[1][47] 가 \xbf 혹은 \x40이면 안된다. 저 말은 return 할 주소가 \xbf 로 시작하는 스택의 어느 공간도 안되고 \x40으로 시작하는 코드영역도 안된다는 것이다. 그리고 취약점은 strcpy()의 사용으로 인해서 bof가 터진다. 그 후 memset()로 buffer+SFP를 0으로 초기화하면서 프로그램이 종료된다. 이 문제는 간단하게 ret가젯을 이용하여 쉽게 우회가 가능하다. ret의 주소는 \xbf도 \x40도 아니기 때문에 ret 가젯을 이용하여 system()를 불러오던 환경변수에 쉘코드를 넣고 쉘코드를 실행시키던 할 수 있다. objdum..
-
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..
-
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으로 세팅하는것을 확인할 수 있다. 그렇다면 남은 공간은 스택의 낮은 주소가 있다. 이해를 위해 그림을 그려보면 현재 스택은 이러한 형태..
-
Plaid CTF 2013 ropasaurusrex write-upCTF Write-Up 2018. 3. 6. 06:57
Plaid CTF 2013 ropasaurusrex 라는 문제를 풀어봤다. 먼저 정적분석을 위해 IDA로 열어본다. 먼저 main()를 살펴보면 어떤 함수를 호출하고 write()를 호출하여 win\n 이라는 문자열을 출력해주는 것을 볼 수 있다. 그 어떤 함수에 들어가 보면 바로 취약점을 찾을 수 있는데,이는 char buf 가 bp-88 즉, 136 byte의 공간을 할당 받았지만, 바로 밑 read()에서 256 byte를 입력받게 되어있기 때문에buffer overflow 취약점에 해당된다. 여기까지 정적분석을 마쳤으니 동적분석을 해보자. 먼저 실행을 해보면 예상처럼 입력을 받고, win이라는 문자열을 출력해준다. 그리고 memory 보호기법을 확인 해보면 NX bit 만 걸려있었다. 이는 쉘코드..
-
Stack6 풀이System hacking training/Protostar 2018. 2. 16. 21:20
[문제] 문제를 보면 쉘코드를 올려서 문제를 풀 수 없도록 되어있네염 0xbf로 시작하는 모든 주소는 예외처리에 걸리기 때문이지요~ㅎ 하지만 취약점은 존재합니다. 역시나 gets()를 사용하였기 때문에 bof 취약점이 존재하는데요. 쉘코드를 쓸 수 없지만 쉘을 띄우기 위해서는 RTL이라는 기법을 쓸 필요가 있겠네요~ 보면 메인은 별게 없고, getpath()를 보면 총 스택공간을 0x68 (dec : 104) 만큼 할당하고 ebp-76이 buf의 시작주소임을 알 수 있습니당 그렇다면 SFP까지 총 80 byte 더미값을 채우고 system()를 return address로 덮고, 인자값을 주기 위해 더미 4 byte 채운뒤 /bin/sh이 위치한 주소를 적어주면 system("/bin/sh")가 실행되어..