학사 나부랭이

Hacker School - level9 본문

Dot-Gabi/Hacker School Prob.

Hacker School - level9

태양왕 해킹 (14세) 2021. 3. 28. 22:04

먼저 코드를 자세히 알아볼까요?

fgets: 스트림(여기서는 아래의 stdin)에서 \n까지 또는 n-1개(여기서는 39개, 마지막은 null문자가 들어가야 해서 그래요.)까지 읽어 들이고 buf에 저장해요. \n이 있는 경우 \n까지 저장하죠.

stdin: 표준 입력 버퍼, 그러니까 입력받은 데이터를 잠시 담아두는 메모리예요. 반대로 stdout은 출력할 데이터를 잠시 담아두는 메모리죠.

strncmp: strcmp와 같은데 대신 범위를 지정하는 것만 달라요. 그래서 아래처럼 goo를 넣어도 2개만 비교하니까 go와 같다고 판단하죠.

setreuid: 원형은 setreuid(ruid, euid)이며 ruid와 euid는 바로 아래에 다시 설명할게요. 여기서 setreuid는 ruid와 euid를 모두 설정하겠다는 의미예요. 그리고 3010은 passwd파일을 열어본 결과 level10의 uid이네요.

ruid, euid(Real User ID, Effective User ID): 각각 진짜 유저 아이디와 유효(일시적인) 유저 아이디예요. 즉, SetUID가 걸린 파일을 실행하면 EUID만 변경되어 실질 유저는 level9이나 일시적으로 level10으로 권한을 얻게 되는데 여기서는 setreuid로 실제 유저조차 level10으로 바꿔줘요.

거기에 마지막으로 level10으로 셸까지 들고 오니 프로그램에서 나오면 level10으로서 활동할 수 있게 되는 거죠.

 

버퍼 오버플로우를 이용해야 할 것 같아요. 어디서 오버플로우가 일어나 buf2를 오염시켜줄지 모르니까 비슷한 코드를 짜 볼까요?

17번째부터 buf2로 오염되네요. 즉 아래와 같은 메모리 구조라고 예측할 수 있어요.

그럼 아무 글자나 16글자를 입력한 후 go를 넣으면 오버플로우로 뚫릴 거예요.

그런데 그냥 이렇게만 보면 재미없죠. 한 번 까 볼까요?

 

들어가기 전에!

lea(Load Effective Address): 좌변(레지스터만 가능)에 우변의 주소 값을 넣어요.

mov(MOVe): 좌변에 우변(혹은 상수)의 값을 입력해요.

이번에는 보기 쉽게 인텔 맛으로 보자고요.ㅋㅋㅋ main+3까지 보면 스택 프레임을 만들고 16진수로 28 그러니까 10진수로는 40바이트의 메모리를 스택에 확보시키네요.

fgets를 실행하는 부분이네요. main+35는 stdin을 나타내고 41에서 코드에서 설정해준 40바이트, 43에서 ebp-40이 buf인 것을 알 수 있어요.

strncmp에 인수를 넣는 부분이에요. main+63에서 "go"를 넣고 61에서 2를 넣으면 buf2를 넣는 부분은 55겠네요. 그럼 buf2는 ebp-24라는 거겠죠?

그리고 main+52를 보면 buf 시작점과 buf2시작점 사이에는 16바이트가 알 수 있어요.

'Dot-Gabi > Hacker School Prob.' 카테고리의 다른 글

Hacker School - level8  (0) 2021.03.27
Hacker School - level7  (0) 2021.03.26
Hacker School - level6  (0) 2021.03.25
Hacker School - level5  (0) 2021.03.25
Hacker School - level4  (0) 2021.03.25
Comments