-
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 Overflow(Overwrite)의 약자로 SFP의 1byte를 오버플로우 하는 기법이다.
해커가 SFP의 1byte를 조작함으로서 ret명령 실행시 원하는 주소로 실행흐름을 조작할 수 있다.
이 기법에 대해서는 좀 더 상세하게 포스팅하겠다.
따라서 SFP의 1byte를 조작하여 원하는 주소로 return할 수 있다.
FPO의 원리에 따라 SFP의 1byte를 Overflow하여야 하는데
쉘코드가 위치한 주소보다 -4 에 위치한 주소로 SFP를 조작하면 된다.
따라서 페이로드는 이렇게 구성된다.
`python -c 'print "쉘코드의 시작 주소" + "NOP Sled + shellcode" + "쉘코드의 시작주소 - 4"'`
이제 직접해보자.
먼저 buffer에 쉘코드를 넣기 위해 buffer의 시작 주소를 알아보자.
0x41414141이 eip 에 들어갔기 때문에 segmentation fault가 뜨고 core 파일을 생성하였다.
0x41414141이 들어간 첫 주소를 스택을 확인하여 찾아내었는데
buffer의 첫 주소는 0xbffffab4이다.
다시 페이로드를 보자.
`python -c 'print "쉘코드의 시작 주소" + "NOP Sled + shellcode" + "쉘코드의 시작주소 - 4"'`
여기서 우리는 eip에 들어가는 값을 쉘코드의 첫 주소로 해야하는데
buffer의 시작 주소에 +4를 해야 정확한 쉘코드가 있는 위치의 주소가 ret(pop eip / jmp eip) 과정에서 esp 값이 eip 로 들어가기 때문에
쉘코드의 시작 주소에 buffer의 시작 주소 - 4한 위치의 주소를 넣어줘야한다.
그리고 11byte의 Nop Sled와 쉘코드를 넣고
SFP에 쉘코드의 시작 주소 즉 buffer의 시작 주소 -4한 주소의 마지막 바이트를 넣어줘야한다.
이제 buffer의 첫 주소를 알았으니 공격을 해보자.
쉘을 띄우는데 성공하였다.
이제 디렉토리를 옮겨서 다시 익스하면
darkknight의 권한을 가진 쉘을 띄울 수 있다.
이로써 풀이를 마친다.
FPO에 대한 개념은 추후 포스팅을 하겠다.
반응형'System hacking training > Hackerschool LOB' 카테고리의 다른 글
LEVEL 14 giant write-up (0) 2018.05.12 LEVEL 13 bugbear write-up (0) 2018.04.26 LEVEL 11 golem write-up (0) 2018.04.20 LEVEL 10 skeleton write-up (0) 2018.04.11 LEVEL 09 vampire write-up (2) 2018.04.04