본문으로 바로가기

[Protostar] Stack4 풀이, write-up

category Wargame/Protostar 2019. 1. 9. 16:54

Protostar --- Stack4



Stack4의 내용이다.


Stack4 takes a look at overwriting saved EIP and standard buffer overflows.


Stack4의 내용을 해석해보면 다음과 같다.


Stack4는 saved EIP를 overwrting하는것, 일반적인 buffer overflow에 주목하면 된다.



Stack4의 Hints이다.


A variety of introductory papers into buffer overflows may help.

gdb lets you do "run < input"

EIP is not directly after the end of buffer, compiler padding can also increase the size.


Stack4의 Hints를 해석해보면 다음과 닽다.


다양한 입문자들을 위한 buffer overflow 서적(논문)은 도움이 될 것이다.

gdb는 "run < [input file name]"을 통해 input 값을 넣을 수 있다.

EIP는 buffer의 바로 끝에 붙어있지 않다. compiler padding은 공격해야할 크기를 증가시킬 수 있다.



stack4.c의 소스코드를 보자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
 
void win()
{
  printf("code flow successfully changed\n");                                    
}
 
int main(int argc, char **argv)
{
  char buffer[64];
 
  gets(buffer);
}
cs



char type 64 byte array buffer를 선언한다.

gets() 함수를 통해 user로부터 값을 입력받는다.



1
2
3
4
5
6
int main(int argc, char **argv)                                                    
{
  char buffer[64];
 
  gets(buffer);
}
cs



win() 함수는 "code flow successfully changed\n"를 출력한다.



1
2
3
4
void win()
{    
  printf("code flow successfully changed\n");                                    
}
cs




Stack4를 일반적으로 실행하면 절대 win()을 실행할 수 없다.

따라서 Stack4의 목표는 EIP를 변경하여 win() 함수를 실행하는것에 목적을 둔다.

Stack4를 gdb를 통해서 분석을 진행하자.






gdb를 바탕으로 stack의 구조를 그려보면 다음과 같다.






RET(EIP)를 수정하기 위해 overflow 시켜야할 크기는 다음과 같다.

64 byte(buffer) + 8 byte(SFP) = 72 byte padding.


72 byte padding 후 8 byte의 win() 함수의 주소를 적어주면 main 함수가 종료된 후 win()의 주소로 jump하여 실행을 할 것이다.





'Wargame > Protostar' 카테고리의 다른 글

[Protostar] Stack6 풀이, write-up  (0) 2019.01.16
[Protostar] Stack5 풀이, write-up  (0) 2019.01.12
[Protostar] Stack3 풀이, write-up  (1) 2019.01.08
[Protostar] Stack2 풀이, write-up  (0) 2019.01.07
[Protostar] Stack1 풀이, write-up  (0) 2019.01.06