profile image

L o a d i n g . . .

passcode 문제 모습이다.

 

우선 ssh로 접속하고 파일들을 확인해주었다.

 

 

passcode 파일을 실행하니 이름을 입력받고, 입력받은 이름을 출력한 뒤 passcode1를 입력받는다.

그런데 아무 값이나 입력하니 segmentation falut가 발생했다.

 

 

그래서 passcode.c 소스 파일을 확인해보았다. main 함수, welcome 함수, login 함수 총 세 부분으로 나누어진다.

main에서 welcome() 과 login()을 실행시킨다.

 

welcome 함수의 경우 이름을 입력받아서 출력해준다.

이때 버퍼의 크기인 100 byte 만큼만 입력받아 ret를 변경해주진 못할 것으로 보인다.

 

login 함수의 경우, passcode1과 passcode2를 입력받아 passcode들이 특정값과 일치할 경우 flag 파일을 보여준다.

그런데 이때, 한 가지 눈여겨 볼 점이 scanf로 입력받을 시 passcode의 주소에 값을 입력받는 것이 아니라는 점이다.

 

scanf("%d", passcode1); 

passcode 앞에 &연산자가 없으므로, passcode1 값을 주소로 하는 곳에 입력을 받는다.

그런데 passcode1은 앞에서 초기화 되지 않으므로 dummy 값이 저장되고 이 dummy 값을 주소로 해서 값을 입력받기에 앞에서 segmentation fault가 발생한 것이다.

 

 

일단은 잘 모르겠어서 디버깅 해보기로 했다.

welcome()

welcome 함수를 디버깅한 모습이다.

[ebp-0x70] 이 name[100]의 위치이다.

 

 

login()

login 함수를 디버깅한 모습이다.

[ebp-0x10]이 passcode1의 위치이다.

-> name 버퍼와 passcode는 0x60 만큼 차이가 난다. 0x60은 96바이트이므로 welcome()에서 scanf 입력 시 4바이트에 해당하는 passcode 값을 조작할 수 있을 것이다.

-> 이때 login()에선 passcode 값을 주소로 해서 입력을 받는다.

따라서 이는 원하는 주소에 원하는 값을 입력할 수 있다는 뜻이 된다. 

 

 

그렇다면 이 상항에서 어떻게 flag를 획득할 수 있을까?

'내가 원하는 주소에 원하는 값을 입력할 수 있다' 라는 것을 보고 got overwrite가 떠올랐다.

got 라는 고정된 주소에 system 함수의 시작 주소를 overwrite 한 뒤, 해당 함수가 호출되면 system 함수가 실행되며 flag를 획득할 수 있을 것이다.

 


 

이때 fflush 함수를 사용할 수 있을 것 같다.

fflush_got에 system 함수 시작 주소를 overwrite 한 뒤, fflush 함수가 실행되므로 flag가 획득될 것이다!

 

payload = "A"*96 + fflush_got 주소 + system("/bin/cat flag") 시작 주소

위와 같이 payload를 작성해보았다.

 

 

구해야 할 것은 다음과 같다.

1. fflush_got 주소

fflush@got : 0x804a004

2. system("/bin/cat flag") 시작 주소

system("/bin/cat flag") : 0x80485e3

 

"A"*96 + 0x804a004 + 0x80485e3

(python -c 'print "A"*96 + "\x04\xa0\x04\x08" + "\xe3\x85\x04\x08"';cat) | ./passcode

위와 같이 exploit code를 짰는데 익스가 안되었다..!

 

(python -c 'print "A"*96 + "\x04\xa0\x04\x08" + "134,514,147"';cat) | ./passcode

생각해보니 뒤에는 scanf("%d", passcode1);의 형태 즉, 10진수 형태로 받아 10진수로 바꿔서 넣어줬다.

 

성공적으로 플래그를 획득하였다!!!!!!

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

[Pwnable.kr] UAF  (0) 2021.05.08
[Pwnable.kr] 6번 random  (0) 2021.04.08
[Pwnable.kr] 4번 flag  (0) 2021.04.08
[Pwnable.kr] 3번 bof  (0) 2021.04.01
[Pwnable.kr] 2번 collision  (0) 2021.04.01
복사했습니다!