관리 메뉴

의미없는 블로그

protostar1 - stack0.c (다른 변수 덮어씌우기) 본문

# 나/pentest (WEB)

protostar1 - stack0.c (다른 변수 덮어씌우기)

SaltLee 2019. 8. 6. 17:22

 

칼리에서 아래 코드를 작성한다~

 

modified = 0 으로 지정되어 있는데

modified != 0 일 때 문제가 풀리게 되어 있다~

 

스택에 대충 아래와 같은 순서로 쌓인다고 볼 수 있는데

buffer 가 modified 다음에 쌓이니까

buffer 에 글자를 많이 넣어서 modified 를 덮어 씌워서 0 이 아니게 만들면 된다~

 

 char buffer[64]

------------------

 int modified     → 0

------------------

 EBP

------------------

 RET

------------------

 

buffer 에 글자 넣을수록 RET 방향으로 = 주소 커지는 방향으로 글자 쌓인다

스택포인터가 스택의 젤 꼭대기를 가리키는데

char buffer[64] 가 마지막에 들어와서 스택포인터가 젤 꼭대기를 가리키게 되었으면

꼭대기 아래로 데이터가 주르륵.. 써지는걸 상상하면 된다

 

어쨌든 문제 풀어보려면 실행 파일을 만들어야 하는데

요즘은 기술이 발달해서인지 컴파일하면 알아서 취약하지 않은 파일을 만들어 준다고 한다

그래서 취약한 파일로 컴파일 하려면 옵션을 지정해 줘야 한다고 함

[gcc -z execstack -no-pie -w -o stack0 stack0.c]

 

생성된 파일 실행(./stack0) 시키고 입력값으로 1 넣어보면 Try again? 나온다

modified 가 0 이기 때문에~

 

modified 를 덮기 위해 buffer 에 글자를 많이 집어넣는다

코드에 보면 char buffer[64] 로 되어 있어서 글자를 64개 넣으면 덮어씌워질거라 생각하는데

왜때문인지 모르겠지만 메모리 구조상 딱 64개로는 안덮어진다고 함~

 

그래서 80개 정도 집어넣기 위해 아래와 같이 80개 a 를 출력쓰

 

파일 다시 실행(./stack0) 시키고 위에 값을 복사해서 집어넣으면

you have changed the 'modified' variable 출력 된다~ 끝

 

선생님이 문제를 푸는것보다 원리를 이해하는것이 중요하다고 하셨다

그래서 gdb 로 디버깅 해본다

[gdb ./stack0] 하면 된다

 

[disas main] 은 main 함수의 어셈블리를 보는 명령인듯 하다

기범씨가 인텔 칩셋을 많이 쓰니까 [set disassemble-flaver intel] 해서 보라고 했는데
일단 1도 모르니깐 선생님이 하는대로 그냥 한다~

 

중간에 [test %eax, %eax] 가 보이는데 TEST 는 두개를 AND 시켜서 결과가 0 인지 아닌지 판별할때 쓴다고 함

그러므로 저 부분이 if(modified != 0) 가 시작되는 부분이라고 볼 수 있는건가?

 

무튼 저 부분에 BreakPoint 를 걸려면 [b *main+42] 이렇게 해주면 된다

 

BreakPoint 걸고 [run] 하면 걸린곳 까지 실행된다

 

[disas main] 해보면 화살표로 BreakPoint 걸려있는 것 볼 수 있다

 

나는 저 어셈블리 코드에서

<+29>[mov $0x0, %eax] 이게 modified = 0 이니까 %eax 에 0 을 넣고

<+39>[mov -0x4(%rbp), %eax] 이게 get(buffer) 로 받은 값을 %eax 에 넣어서

<+42> 에서 TEST 로 두 값을 비교하는 거라고 생각하는데 맞나?

 

무튼 TEST 에 BreakPoint 걸렸으니

<+39> 의 [mov -0x4(%rbp), %eax] 까지 실행된 상태에서

아래와 같이 [info reg $eax] 로 EAX 값 봐보면 0x61616161 로 aaaa 가 들어가 있는것 볼 수 있다

 

[info reg $rbp] 해보면 0x7fffffffe180 인데 -0x4(%rbp) 가 가리키는 위치에 EAX 가 들어가 있으니

[x/30gx $rsp] 해보면 0x7fffffffe180 아래로 616161... 80개 들어가 있는 것 볼 수 있다 어렵쓰..

 

 

Comments