tmxklab

[pwnable.kr] passcode 본문

War Game/pwnable.kr

[pwnable.kr] passcode

tmxk4221 2020. 11. 20. 17:36

1. 문제 확인

 

[ passcode.c ]

#include <stdio.h>
#include <stdlib.h>

void login(){
	int passcode1;
	int passcode2;

	printf("enter passcode1 : ");
	scanf("%d", passcode1);
	fflush(stdin);

	// ha! mommy told me that 32bit is vulnerable to bruteforcing :)
	printf("enter passcode2 : ");
  scanf("%d", passcode2);

	printf("checking...\n");
	if(passcode1==338150 && passcode2==13371337){
			printf("Login OK!\n");
      system("/bin/cat flag");
  }
  else{
      printf("Login Failed!\n");
		  exit(0);
  }
}

void welcome(){
	char name[100];
	printf("enter you name : ");
	scanf("%100s", name);
	printf("Welcome %s!\n", name);
}

int main(){
	printf("Toddler's Secure Login System 1.0 beta.\n");

	welcome();
	login();

	// something after login...
	printf("Now I can safely trust you that you have credential :)\n");
	return 0;	
}

음 passcode1에 338150, passcod2에 13371337을 넣으면 될 것 같다.

 

 


2. 접근 방법

 

근데 passcode1에 입력할 때 segmetation fault가 발생한다.

 

 

뭐지.. 궁금해서 걍 ftp로 passcode다운받아서 확인ㄱㄱ

보니깐 passcode1에 puts()의 코드영역 주소 값이 들어있다

아 생각해보니깐 scanf에서 받을 때 변수 앞에"&"안 붙였음. 그래서 세그먼테이션 폴트가 뜸

 

돌아와서 처음 welcome함수에서 name값을 입력받을 때 최대 100byte입력받을 수 있다. 꽉 채워서 입력을 받고 디버깅을 하다보니

 

스택에 있는 passcode1의 값을 변경할 수 있다.

 

즉, name에 96byte는 더미 나머지 4byte는 login()에서 첫 번째 scanf의 주소 값이 된다. 그러면 scanf("%d", passcode1);에서 passcode1은 값이 됨

 

-> 그러니깐 aaw가 쌉가능하다.

 


3. 문제 풀이

 

흠 그럼 어느 주소에다가 어떤 값을 넣어야 할까???

 

참고로 login()의 두 번째 scanf에서도 passcode2변수 앞에 "&"을 지정하지 않았으니 어떻게 name값 주작해서 첫 번째 scanf를 통과해도 두 번째 scanf를 호출하지 않고 통과해야 한다.

Partial RELRO이므로 GOT Overwrite가 쌉가능하다.

 

두 번째 scanf가 실행하기 전에 printf가 실행되니깐 printf@got Overwrite를 하자. 그리고 원래 목적은 system("/bin/cat flag");을 실행시키는거니깐 printf@got에 login()의 코드영역에 있는 system("/bin/cat flag")를 실행시키는 주소 값을 넣자

 

printf@got : 0x0804a000

 

text영역 주소 : 0x080485e3

 

  • name에 입력 받는 값 = "A"*96 + \x00\xa0\x04\x08
  • passcode1에 입력 받는 값 = \xe3\x85\x04\x08(134,514,147)

 

참고로 첫 번째 입력 값은 python사용해서 헥사 값 넘겨주면 되고 두 번째 passcode1에 입력 받는 값은 int형이니깐 134,514,147(0x80485e3)을 입력하면 됨

 


4. 몰랐던 개념

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

[pwnable.kr] input  (0) 2020.11.20
[pwnable.kr] random  (0) 2020.11.20
[pwnable.kr] flag  (0) 2020.11.20
[pwnable.kr] bof  (0) 2020.11.20
[pwnable.kr] collison  (0) 2020.11.20
Comments