Pwnable.kr의 문제입니다. 롸업을 보기 전에 문제를 풀어주세요.

 

https://pwnable.kr 

 

https://pwnable.kr

   there are flag   files corresponding to each challenges (similar to CTF), you need to read it and submit to pwnable.kr to get the corresponding point. in order to read the flag file, you need some skills regarding programming, reverse-engineering, bu

pwnable.kr


이 문제는 쉽습니다..

rand함수에 대해서 조금만 공부했다면 알 수 있는 내용이거든요..ㅎ

 

rand 함수를 통해 random 변수에 입력하고, key를 입력받은 뒤, 이 두 변수의 xor 값이 0xdeadbeef여야 한답니다.

 

rand함수의 취약점? 이라고 해야하나..?

 

아무튼 컴퓨터에서 랜덤함수라는 것은 존재할 수 없습니다.

어떠한 값을 곱하고 나누고 나머지를 구하는 과정을 통해 랜덤'처럼' 보이는 값을 가져오는 것이죠.

 

rand함수는 이 과정을 할 때 가장 기본적인 녀석입니다.

랜덤'처럼'보이는 과정을 거치는 것이 기본적으로 내장되어 있지만, 프로그램을 실행할 때마다 값이 변하지 않기 때문에, 한 프로그램에서 rand 함수를 여러번 사용한다면 랜덤적인 값이 나올 수 있겠지만, 그 프로그램을 여러번 실행했을 때에는 항상 같은 값이 나오게 됩니다.

 

따라서 이 문제의 핵심은...

rand 함수를 사용했기 때문에 저 rand를 통해 어떤 값이 나왔는지만 알 수 있다면 문제를 풀 수 있다는 것이겠죠.

 

gdb로 확인을 해봅시다!

 

peda를 실행해주고?

 

main 함수에서 scanf 부분을 break 해주고, rand 함수 부분에서도 break 해주겠습니다.

 

rand 함수 바로 이전입니다.

 

이제 ni로 실행해주면?

RAX 부분에 0x6b8b4567이 보이는 것을 알 수 있습니다.

 

여러번 실행해도 똑같고요!

 

이제 저 값을 xor 연산해서 넣어주겠습니다!

 

3039230856을 입력해주면 되겠네요!

 

짜잔... 다음과 같이 나왔습니다!

 

끄읕!

'Hacking-기초 > [PWN] Pwnable.kr' 카테고리의 다른 글

Pwnable.kr에서 peda 사용하기  (0) 2020.08.11
[PWN] flag (7pts)  (0) 2020.08.11
[PWN] bof (5pts)  (0) 2020.08.11
[PWN] collision (3pts)  (0) 2020.08.10
[PWN] fd (1pts)  (0) 2020.08.10

pwnable.kr의 문제를 풀다 보면, ssh로 접속해서 gdb를 사용하고 그래야하는데...

gdb를 사용하게 되면 일반 gdb가 나와서 분석하는게 쉽지 않습니다.

 

근데 오늘 문제 풀면서 봤는데 peda를 사용하는 방법이 있네요?

 

저기 보이시나요?

to use peda, issue 'source /usr/share/peda/peda.py' in gdb terminal

 

페다를 사용하기 위해서는 gdb 터미널에서 저 명령어를 입력하라고 합니다.

 

따라서 페다를 사용하기 위해서는

 

1. gdb 파일이름

2. source /usr/share/peda/peda.py

 

이렇게 입력해주시면 됩니다.

 

이렇게요...ㅎ

'Hacking-기초 > [PWN] Pwnable.kr' 카테고리의 다른 글

[PWN] random (1pts)  (0) 2020.08.11
[PWN] flag (7pts)  (0) 2020.08.11
[PWN] bof (5pts)  (0) 2020.08.11
[PWN] collision (3pts)  (0) 2020.08.10
[PWN] fd (1pts)  (0) 2020.08.10

Pwnable.kr의 문제입니다. 롸업을 보기 전에 문제를 풀어주세요.

 

https://pwnable.kr 

 

https://pwnable.kr

   there are flag   files corresponding to each challenges (similar to CTF), you need to read it and submit to pwnable.kr to get the corresponding point. in order to read the flag file, you need some skills regarding programming, reverse-engineering, bu

pwnable.kr


이번 문제는... 처음 보는 종류였어서... 여러 곳을 참고하기는 했습니다..ㅠㅜ

 

 

제가 참고한 부분은 upx 패킹 언패킹이라는 부분인데요...

 

 

 

처음 열었을 때에는 진짜 아무것도 없습니다...

 

이 부분을 봐도 진짜 아무것도 없고... 다 LOAD 부분입니다.

아무리 봐도 TEXT 코드는 없는데... 이게 또 리눅스에서 실행을 하면?

 

또 실행이 됩니다!

 

이게 뭐시당까... 하면서 찾아보고... 찾아보고... 그러다가...

 

UPX 패킹 언패킹이라는 것을 알게 되었고! 이게 패킹 된 상태라는 것을 알게 되었습니다!

 

저기에 //upx.sf.net $

이게 써 있어서 upx라는 것을 짐작할 수 있다는데요!

한번 언패킹을 하기 위해 프로그램을 깔았습니다.

https://itstar.kr/40

 

UPX 패킹 언패킹

안녕하세요 테라트입니다 오늘은 아주 기본적인 패커인 UPX패커에 대해 알아보고 패킹 언패킹 하는 시간을 가져보겠습니다! UPX 측에서 파일을 배포 하는 공식 링크를 가져왔습니다-! URL : UPX 다��

itstar.kr

 

이 블로그를 통해서 UPX 언패킹을 했고,

뭔가 많이 나왔습니다!

 

그래서 main 함수를 들어가서 보니까

 

호오오오 똑같이 나왔습니다!

저기 flag에 정답이 있을거 같아서 더블클릭 해주고,

정답같이 생겨 보이는게 있어서 더블클릭 해주니까!

정답이 나왔습니다!

UPX...? sounds like~~~처럼 정답이 나오게 되니까 직접 해보세요!

 

끝!

'Hacking-기초 > [PWN] Pwnable.kr' 카테고리의 다른 글

[PWN] random (1pts)  (0) 2020.08.11
Pwnable.kr에서 peda 사용하기  (0) 2020.08.11
[PWN] bof (5pts)  (0) 2020.08.11
[PWN] collision (3pts)  (0) 2020.08.10
[PWN] fd (1pts)  (0) 2020.08.10

Pwnable.kr의 문제입니다. 롸업을 보기 전에 문제를 풀어주세요.

 

https://pwnable.kr 

 

https://pwnable.kr

   there are flag   files corresponding to each challenges (similar to CTF), you need to read it and submit to pwnable.kr to get the corresponding point. in order to read the flag file, you need some skills regarding programming, reverse-engineering, bu

pwnable.kr


bof 문제입니다!

Nana told me that buffer overflow is one of the most common software vulnerability.

Is that true?

 

Download: bof 파일

Download: bof.c 파일

 

Running at: 주소

 

이렇네요.

두개의 Download를 받아보니까 하나는 실행 파일이고, 하나는 c언어 파일입니다.

우선 실행을 해보기 전에 c 파일을 봅시다.

 

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

오버플로우 문제라는게 대놓고 보이는게 gets로 그냥 받고있네요..

 

흐음... overflowme라는 변수에 입력을 받지만, 이를 오버플로우시켜서 key라는 변수에 값을 덮어씌운 뒤 0xcafebabe라고 입력을 해줘야 문제가 풀릴 것 같습니다.

 

gdb를 통해 보겠습니다. main 함수에서는 볼게 뭐 없는 것 같고...

func 함수를 보았을 때 +24는 printf 함수인걸 코드와 비교해서 알 수 있고,

+35는 gets함수라는 것을 알 수 있으며,

cmp를 통해서 비교를 하고 있습니다.

 

여기서 하나 확실하게 안 것은 ebp+0x8에 해당하는 주소 값이 key 변수의 주소라는 것입니다.

ebp+0x8과 0xcafebabe를 비교하고 있으니 당연히 그런 것이겠죠.

 

아! 하나 더!

gets 함수를 사용하는 +35에서 그 위에 eax에 ebp-0x2c의 주소값을 입력하게 되는 것으로 보아 overflowme 라는 변수의 위치가 저 부분인 것도 알 수 있겠네요.

 

 

이를 통해 계산을 해보게 되면 2c+8은 34이므로 이를 10진수로 변환하면 52라는 값이 나오게 됩니다.

따라서 두 변수 사이의 거리가 52라는 것이 되겠죠.

 

혹시 모르니, 대충 값을 넣어보고 거리가 어떤지 다시 확인해보겠습니다.

 

A를 여러개 입력한 다음에 deadbeef와의 거리를 계산해보니 52가 맞는걸 또 알 수 있었습니다.

 

 

 

이제 빠르게 페이로드를 짜보도록 하겠습니다.

 

대충 이렇게 짜고 실행을 해봤습니다.

bash가 실행되었다는 것을 알 수 있습니다. 이제 문제를 풀어보겠습니다.

 

?? 뭐징 왜 안되는걸까요?

 

nc 명령어로 실행을 해봤더니... overflow me : 를 출력하기 전에 입력을 받는 모습을 볼 수 있습니다...

아니... 왜이래...

 

그래서 recvuntil을 또 주석처리 해주고 실행을 해줬더니?

 

이렇게 문제가 풀리긴 하네요!

 

끄읕..! 후우 LOB에서 쌓인 짬밥으로 인해 이제 BOF는 어느정도 이해하고 잘 풀 수 있는 수준까지 온걸까요?! 허헣

'Hacking-기초 > [PWN] Pwnable.kr' 카테고리의 다른 글

[PWN] random (1pts)  (0) 2020.08.11
Pwnable.kr에서 peda 사용하기  (0) 2020.08.11
[PWN] flag (7pts)  (0) 2020.08.11
[PWN] collision (3pts)  (0) 2020.08.10
[PWN] fd (1pts)  (0) 2020.08.10

Pwnable.kr의 문제입니다. 롸업을 보기 전에 문제를 풀어주세요.

 

https://pwnable.kr 

 

https://pwnable.kr

   there are flag   files corresponding to each challenges (similar to CTF), you need to read it and submit to pwnable.kr to get the corresponding point. in order to read the flag file, you need some skills regarding programming, reverse-engineering, bu

pwnable.kr


문제를 풀어보도록 합시다!

 

Daddy told me about cool MD5 hash collosion today.

I wanna do something like that too!

 

라네요... MD5 암호화기법중 하나인걸로 아는데...

 

암튼 ssh를 통해 들어가보니까

 

이렇게! 나오게되며 flag는 역시 권한이 없네요.

 

앞선 문제와 똑같습니다!

 

이런 코드가 나오네요.

 

흐음 check_password 함수를 통해 나온 값이 hashcode와 같아야 하고

hashcode의 값은 0x21DD09EC이고...

총 passcode의 길이는 20바이트여야하고... 프로세스를 시작할 때 두 번째 인자로 데이터를 입력해줘야 하는것 같습니다.

 

그 다음 check_password를 보면 포인터로 받고 int로 자르는거같네요.

대충 봤을 때 20바이트가 인자로 넘어오고, ip는 int형 변수 4바이트니까 ip[0]~ip[4]까지 되는 것 같고, 결국 4바이트씩 잘라서 정수형으로 더하는 것 같습니다.

 

따라서 그냥 0x21DD9EC를 5등분 하고 집어넣은 뒤 나머지를 17~20바이트 부분에 집어넣어주면 될 것 같습니다.

5등분한 결과 6C5CEC8이 각 몫으로 존재하고, 

5가 나머지로 존재한다는 것을 알 수 있었습니다.

 

결론.적으로!

6C5CEC8을 4번 붙이고 5번째에는 6C5CECC를 붙이면 될 것 같습니다.

리틀 엔디안 방식으로 다음과 같이 입력해주게 되면? 끝!

 

'Hacking-기초 > [PWN] Pwnable.kr' 카테고리의 다른 글

[PWN] random (1pts)  (0) 2020.08.11
Pwnable.kr에서 peda 사용하기  (0) 2020.08.11
[PWN] flag (7pts)  (0) 2020.08.11
[PWN] bof (5pts)  (0) 2020.08.11
[PWN] fd (1pts)  (0) 2020.08.10

+ Recent posts