Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

의미없는 블로그

protostar4 - stack3.c (pwn 사용해서 공격하기 - return2lib) 본문

# 나/pentest (WEB)

protostar4 - stack3.c (pwn 사용해서 공격하기 - return2lib)

SaltLee 2019. 8. 26. 19:31

 

코드 작성

 

아래 포인터에 대한 설명을 보면 알 수 있듯이..

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 뜬다~ 매번 새롭쓰

Comments