의미없는 블로그
protostar2 - stack1.c (원하는 스택 바꾸기) 본문
칼리에서 코드 작성한다~
지난번과 같이 스택 구조는 아래와 같고
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 나온다~
어렵쓰
'# 나 > pentest (WEB)' 카테고리의 다른 글
protostar4 - stack3.c (pwn 사용해서 공격하기 - return2lib) (0) | 2019.08.26 |
---|---|
protostar3 - stack2.c (Peda 입문, 그리고 환경 스택) (0) | 2019.08.22 |
[Tools] Burp Helper(Plugin) 설치 (0) | 2019.08.19 |
[Tools] Burp Suite HTTPS(SSL) 캡쳐하기 (1) | 2019.08.19 |
Python - Nmap, Dirb, Trace 메소드 스캔 (0) | 2019.08.13 |