[어설픈] LOB 1번 gate 문제풀이

2019. 3. 4. 20:25System Hacking/[LOB] Hacker School


안녕하세요!

오늘은 LOB의 첫 번째 문제

gate를 풀이해보도록 하겠습니다!


아래에 소스코드가 나와있습니다!

첫 번째 문제라 그런지 비교적 간단하네요!


소스코드를 분석해보자면,

우선 argv 형식으로 입력을 받네요!


다음으로 버퍼 크기가 256byte네요!


그리고 argument의 갯수가 2개 보다 작으면 안되요!

그러면 argv error 라는 문구를 출력하고 

프로그램이 종료 돼요!


그리고 바로 다음으로 strcpy 하는데!

이 부분이 취약하죠!

얼만큼 copy할지 크기를 지정 안해줘서 오버플로우가 터져요!

뭐 FTZ에서 봤던 문제와 매우 비슷하네요!


제일 기본적인 오버플로우 풀이방법인

shellcode를 그냥 버퍼에 넣고

그리고 ret_addr를 버퍼의 주소로!  


이건 제가 FTZ 풀이 할 때도 많이 했던 방식이죠?


근데 여기도 혹시 실제 선언한 버퍼 크기보다

더 많은 공간이 할당되나 확인하려고 

gdb를 켜봤습니다!


그랬떠니 0x100 =256byte 딱 맞춰서 할당하네요!

이게 redhat 6.2 버전이라 

낮은 버전의 경우 더미 값이 없다고 하네요!


그러면 뭐 payload는 벌써 머릿속에 그려지시나요?

간단하게 스택구조 그려드리겠습니다


[gate의 스택구조]


buffer - 256 byte

EBP - 4byte

RETURN ADDRESS - 4byte




풀이 방법은 매우 간단하죠?

RETURN ADDRESS 전까지(=260 byte) 쉘코드와 NOP(\x90)로 채우고!

RETURN ADDRESS는 BUFFER 시작주소로 하면!

(\x90) NOP SLED 계속 타다가 쉘코드 만나면 바로 

쉘이 따지겠죠?


그래서 저는 payload를 이렇게 하기로 했습니다!

\x90 * 100 + "25 byte shellcode"+ \x90 * 135 + "ret addr"

그러면 ret addr 값은 어디서 찾나요? 

buffer의 주소를 찾아야죠!


gdb에서 strcpy가 끝난 main+59에 

breakpoint를 걸고!

payload에서 나머지는 다 채우고

 ret addr만 \xaa\xaa\xaa\xaa로

넣고 실행시켰습니다!


그리고 breakpoint에서 멈췄을 때!

$ebp+0xffffff00값을 확인했습니다!


왜 $ebp+0xffffff00이냐구요?

위에 gdb 사진에서 main+53 부분에서 

push %eax하죠?

바로 윗줄에서 %eax에 $ebp+0xffffff00을 넣죠?

이게 buffer의 주소에요!


왜냐하면 함수의 인자는 거꾸로 push 되거든요!


ex) example( int a, int b, int c)

이렇게 example 함수가 있고 

인자가 있을 때!


gdb로 만약에 까본다고 하면 

int c가 먼저 push 되고

int b가 다음으로 push 되고

int a가 마지막으로 push 되요!


근데 여기선 strcpy(buffer, argv[1])이니

argv[1]이 먼저 push되고

buffer가 나중에 push 되겠죠?

제일 늦게?


call strcpy가 되기 직전에 

push된게 %eax니 

저게 buffer의 주소구나! 라고 생각한거에요!


다시 돌아와서 그래서 주소를 찾아보니!

ret address를 0xbffff908로 하면 되겠네요!


그래서 아까 마지막에 ret_address만 \xaa\xaa\xaa\xaa에서 

\x08\xf9\xff\xbf로 바꿔서 

gate에 실행하면!


바로 아래와 같이 exploit가 성공하고

쉘이 따입니다!


고생하셨습니다!