본문 바로가기

해킹공부/pwnable.kr

passcode

10점짜리 문제!!!

시~~~작!!!

 

 

파라미터도 없고 반환값도 없는 함수 두 개를 연달아서 실행시켰다.

이렇게 실행하면 assembly에선 연달아서 2번 call을 호출한다.

즉 두 함수의 ebp값이 같다는 것이다.

 

 

welcome함수에선 그냥 string을 입력받고 출력해준다.

 

 

그냥 passcode1,2를 입력받길래 비교값을 그냥 입력했는데 몇번을 해도 안된다.

잘 보니까 scanf에 &passcode1이 아니라 그냥 passcode1로 써놨다. 이러니 안되지...

 

맨 처음으로 돌아가서 welcome과 login은 같은 ebp 주소를 갖는다.

그래서 welcome의 name과 passcode 2개가 겹칠거라 생각하고 디버깅을 해 보았다.

 

 

name을 입력받고 출력하는 scanf와 printf 호출부분이다.

scanf에서 100개의 입력제한을 걸어두었기 때문에 [ebp-0x70]에서 [ebp-0x0c]까지 총 100byte를 입력받는다.

 

 

소스코드의 순서에 따르면 [ebp-0x10]이 passcode1, [ebp-0x0c]가 passcode2이다.

즉 passcode1은 welcome에서 name과 겹치게 된다.

name을 입력받을 때 미리 passcode1에 값을 넣어줄 수 있게 됐다.

 

이를 통해 두 변수에 비교값을 넣어주려 했으나 방법이 없어 다른 방법을 알아보았다.

got overwrite라는 방법이다. ( 자세한 내용은 나중에 알아보자 )

 

우선 name을 입력할 때 마지막 4byte는 printf의 got주소를 입력하자.

function의 got주소는 function@plt+2~5이다.

 

 

gdb를 사용해 확인한 printf의 got값은 0x0804a000이다.

함수의 plt+6엔 함수의 got값을 가져오는 코드가 있다. 이 때 가져온 got주소는 plt+2에 저장된다.

got주소에는 해당 함수의 library주소가 입력되어 있는데 이 주소는 함수가 한번 실행했을 때 입력된다.

즉 프로그램이 write권한을 갖는다는 것이다.

 

위 코드에서 login함수에서처럼 scanf("%d", passcode1);과 같은 코드에선 passcode1에 저장된 주소값에 입력값을 저장한다.

즉 passcode1에 printf의 got주소를 입력하고 scanf를 통해 system함수의 호출 부분을 입력한다면 printf 호출시 system함수의 호출 주소로 jump하게 된다.

 

 

name의 마지막 4byte엔 printf의 got주소인 0x0804a000을, scanf를 통한 입력시엔 system함수 실행주소인 0x080485e3을 입력하면

printf 호출시 0x080485e3으로 jmp하게 되 flag를 확인할 수 있게 된다.

scanf에선 정수형으로 0x080485e3을 134514147로 입력한다.

 

got overwrite를 듣고 '유레카!!' 해서 풀었지만 설명이 잘 된건가 모르겠다....

( 나중에 보면 못알아먹을 것 같다ㅠㅠ )

'해킹공부 > pwnable.kr' 카테고리의 다른 글

shellshock  (0) 2017.09.07
blackjack  (0) 2017.08.30
lotto  (0) 2017.08.30
mistake  (0) 2017.08.30
random  (0) 2017.08.30