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
관리 메뉴

의미없는 블로그

protostar2 - stack1.c (원하는 스택 바꾸기) 본문

# 나/pentest (WEB)

protostar2 - stack1.c (원하는 스택 바꾸기)

SaltLee 2019. 8. 20. 19:14

 

칼리에서 코드 작성한다~

 

지난번과 같이 스택 구조는 아래와 같고

 

 char buffer[64]

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

 int modified      → 0

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

 

modified = 0 인 상태고

modified 가 0x61626364 일 때 풀린다

buffer[64] 에 글자 많이 집어넣어서 덮어쓴담에 modified 위치에서는 0x61626364 로 덮어쓰면 된다~

 

마찬가지로 gcc 에 옵션써서 컴파일 하고 실행해 본다

소스코드에 if(argc == 1) 로 인자가 1개면 에러내고 있어서 다음 인자를 넣어줘야 돌아간다

argv[0] = ./stack1

argv[1] = 1234

 

소스코드에 strcpy(buffer, argv[1]); 을 보면 strcpy 함수로 인자값 받아서 buffer 에 넣고 있는데

strcpy 함수는 누구나 아는 취약한 함수

buffer 에 값 넣어서 modified 까지 덮어쓰기 할 수 있다

 

 

[gdb ./stack1] 로 디버깅 하면서 해본다~

저번에는 쌤이 그냥 하시더니 이번에는 [set disassembly-flavor intel] 로 바꿔서 보시넹

[disas main] 으로 어셈블리 봐보자

 

아래쪽에 [cmp eax, 0x61626364] 가 if(modified == 0x61626364) 인 것 알겠다

바로 전에 [mov eax, DWORD PTR [rbp-0x4]] 로 eax 에 rbp-0x4 가 가리키는 위치의 값을 넣고

그 담에 eax 값과 0x61626364 값을 비교하는 거니까 modified = rbp-0x4 위치의 값 = 0 = 덮어씌워야 할 값

 

그리고 아래 세 개를 묶어서 봐야하는데

<+65> [mov rsi, rdx]

<+68> [mov rdi, rax]

<+71> [call 0x401030 <strcpy@plt>]

 

rsi 는 source, rdi 는 destination 의미로

strcpy(buffer, argv[1]); 에서 argv[1] 값이 buffer 에 들어가는거니까

rsi = argv[1]

rdi = buffer

 

그래서 <+68> [mov rdi, rax] 를 보면 rax 값이 rdi 에 들어가고

rax 는 <+61> [lea rax, [rbp-0x50]] 에서 rbp-0x50 주소의 값이 들어가니까 buffer = rbp-0x50 위치의 값

(lea 는 mov 같은건데 mov 는 우변의 값을 넣는거고 lea 는 우변의 주소값을 넣는거라고 함)

 

 

다시 스택에서 보면 아래와 같은건데

 

 char buffer[64]   → rbp-0x50 위치의 값

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

 int modified      → rbp-0x4 위치의 값 = 0 

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

 RBP (RBP, EBP 는 같은거고 그냥 비트 수 차이)

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

 

RBP 에서 4 만큼 떨어진 위치의 값(-0x4 니까 스택에선 위로 올라가야지..)이 modified 의 시작점이고

50 만큼 떨어진 위치의 값이 buffer 의 시작점이니까

두 개 사이의 간격은 Hex 에서 50 - 4 = 4C 이고 4C 를 Dec 로 바꾸면 76이다

 

즉 buffer 에 76개 글자 집어넣으면 딱 modified 전까지 가는것~~

(그래서 저번 문제에서도 77개부터 modified 가 덮어씌워졌었다)

 

python 으로 글자 76개 출력해서 복사해 주고..

 

<+79> [cmp eax, 0x61626364] 가  if(modified == 0x61626364) 로 비교하는거니까

거기까지 breakpoint 건다 [b *main+79]

그리고 'a' 76개 에다가 'bbbb' 붙여서 run 해본다

 

[info reg $eax] 로 EAX 값 봐보면 0x62626262 들어가 있다

이게 'bbbb' 이다

 

그럼 modified 에 0x61626364 넣어주기 위해

'a' 76개에 'abcd' 붙여서 확인해보면 리틀엔디안인가 그것때문에 0x64636261 로 거꾸로 들어가 있다

 

다시 실행해서 'dcba' 로 넣어주면 EAX 에 0x61626364 로 제대로 들어가 있다

 

modified 를 0x61626364 로 덮어 씌웠으니

[conti] 로 나머지 코드 실행해 주면 you have correctly got the variable to the right value 나온다~

 

어렵쓰

 

Comments