의미없는 블로그
protostar4 - stack3.c (pwn 사용해서 공격하기 - return2lib) 본문
코드 작성
아래 포인터에 대한 설명을 보면 알 수 있듯이..
int (*fp) () 는 그냥 fp 라는 포인터이다
스택에는 아래처럼 쌓이는 거고
fp = 0 으로 선언되어 있는데 if(fp) 일때 fp(); 로 포인터 값을 부르니까
fp 가 0 이 아니도록 덮어씌워주면 된다
buffer[64]
---------------
*fp
---------------
문제는 win() 함수가 호출되어져서 code flow successfully changed 가 출력되어야 하는데
win() 함수를 호출하려면 fp 포인터가 win() 함수를 가리키고 있는 상태에서 fp() 가 호출되어지면 된다
그러므로 fp 포인터를 덮어씌우되 win() 함수를 가리키는 주소값으로 덮어씌워야 한다
컴파일을 하고.. (gets 함수에 대한 경고는 무시)
파일을 실행해 본다
buffer 에 그냥 짧은 입력값 넣었을때는 아무 반응 없는데
buffer 를 초과하는 만큼 입력값 집어 넣으면 fp = 0 이 덮어씌워지고 if문이 실행되어 아래와 같이 된다
gdb 켜고(gdb ./stack3)
[disas win] 하면 win() 함수의 주소값 확인할 수 있다
win() 주소값 = 0x0000000000401142
[disas main] 해서 breakpoint 걸 부분 확인한다
breakpoint 걸고 패턴 100개 생성하여 run 해본다
breakpoint 건 부분까지 실행된 상태에서
이 부분은 if(fp) 로 fp 가 0 인지 아닌지 확인하는 부분이니까
[rbp-0x8] 이 가리키는 위치가 fp 값이라고 볼 수 있다
[rbp-0x8] 이 가리키는 값이 뭔지 찾아가는 과정
[x/10gx $rbp-0x8] 에서 들어있는 값이 0x4134414165414149 인 것을 확인했고
[pattern offset 0x4134414165414149] 해보면 72 니까
우리의 목적은 이 $rbp-0x8 값이 win() 주소값이 되게 하는거니까
그러려면 72개의 임의값 + win() 주소값을 입력값으로 넣어주면 된다는 것 알 수 있다
지난번에 배운대로 python 으로 'A' 72개와 win() 주소값을 거꾸로 넣은 것을 합치면 될 줄 알았는데
\x00 요놈이 출력이 안돼서 제대로 입력값이 안들어간다~
그래서 쌤은 python 으로 코드를 짜서 실행시키신다~
p64() 는 64 비트짜리 포인터라고 한다 여기에다가 win() 주소값 넣는다
python 실행시키면 입력값 잘 들어가서
code flow successfully changed 뜬다~ 매번 새롭쓰
'# 나 > pentest (WEB)' 카테고리의 다른 글
protostar5 - stack4.c (return 덮어씌워서 코드 흐름 바꾸기) (0) | 2019.08.29 |
---|---|
VM 환경 Local 로 포트포워딩 하기 (0) | 2019.08.27 |
protostar3 - stack2.c (Peda 입문, 그리고 환경 스택) (0) | 2019.08.22 |
protostar2 - stack1.c (원하는 스택 바꾸기) (0) | 2019.08.20 |
[Tools] Burp Helper(Plugin) 설치 (0) | 2019.08.19 |