엄마가 나한테 passcode기반의 로그인 시스템을 만들라고 말했다!! 난 처음으로 어떤 에러도 없이 C코드로 컴파일 했다!! 음...근데 컴파일러가 몇가지 경고를 했긴 했는데... 누가 신경쓰겠어~~ 라는 문제이다.


문제만 봐서는 어떤 형식의 문제인지 잘 모르겠고 일단 xshell을 통해서 접속해봤다.


어떤 파일들이 있는지 확인해보자.


passcode를 실행시켜 보았다.


이름을 입력받고 passcode를 입력해서 로그인을 하는 코드인 듯 보인다. 이제 c코드를 한번 살펴보자.



passcode1이 338150이고 passcode2가 13371337만 만족하면 바로 flag를 읽을 수 있다.



main함수는 welcome으로 이름을 입력받고 login을 통해 패스워드를 입력받는다. 그냥 너무 쉽다고 생각해서 바로 passcode를 입력받는 부분에 338150을 집어넣으니까 새그가 떴다.



왜 새그가 떴는지 모르겠어서 다시 코드를 자세히 보니까 scanf에 &가 빠져있는 것을 확인할 수 있다.



그러니까 저 코드는 passcode1이라는 변수에 값을 저장하는 코드가 아니라!!

passcode1이라는 변수 안에 있는 값의 주소에 입력값을 넣는 코드인 것이다!!


이게 무슨말이냐면 만약 passcode1에 0xdeadbeef가 들어있다고 가정해보자. 

만약 scanf("%d", &passcode1); 이라는 코드가 실행된다면 passcode1의 값이 0xdeadbeef에서 입력값으로 업데이트 될 것이다.

하지만 scanf("%d", passcode1); 이 실행된다면 여기서 입력한 값이 0xdeadbeef에 저장되는 것이다.


여기서 문제의 의도를 알 수 있다. passcode에 내가 원하는 주소의 값을 넣어놓는다면 passcode1과 passcode2의 값을 조정할 수 있을 것이다.

그렇기는 한데... 좀더 간단하게 문제를 해결할 수 있었다.


scanf로 passcode1에 입력받은 후에 버퍼를 비우는 fflush(stdin);이 실행된다. 만약 이 fflush함수의 got를 system("/bin/cat flag");의 시작주소로 변경한다면 바로 플래그를 읽을 수 있을 것이다. 어떻게하면 쉽게 주소를 변경할 수 있을까? gdb를 통해 좀더 자세히 보자.



일단 welcome코드를 보면 ebp-0x70부분이 name배열의 시작부분인 것을 알 수 있다.



그리고 passcode1은 ebp-0x10부분에 위치하는 것을 알 수 있다.


생각해보자... passcode1과 name배열의 시작부분의 차이는 0x60이다. 즉 96이므로 name[96]~name[99]부분이 겹친다는 것을 알 수 있다. 

이제 전체적인 흐름을 파악했으니까 페이로드를 짜보자.


1. 처음 welcome함수가 실행될때 마지막 4바이트를 fflush함수의 got값으로 집어넣는다.


2. scanf("%d", passcode1);에서 system("/bin/sh flag");의 시작주소를 넣어 fflush함수의 got값을 변경한다.


이렇게 두단계만 거치면 flag를 읽을 수 있다!!!!

이제 fflush의 got주소와 system의 시작주소만 알아내면 된다.



fflush의 got주소 ==> 0x804a004



system코드가 실행되는 시작주소 ==> 0x080485e3


원하는 값들을 모두 얻었다!!


(python -c 'print "\x90"*96 + "\x04\xa0\x04\x08" + "134514147"') | ./passcode


여기서 scanf는 10진수로 값을 입력받으니까 0x080485e3을 10진수로 바꾸어서 넣어줬다. 이렇게 해주면



성공~!~!~!

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

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

+ Recent posts