main함수를 보면 welcome함수를 호출한다. welcome함수에서는 100byte만큼 name값을 할당해 줄 수 있다.
login함수에서는 passcode1과 passcode2를 해당 값들과 비교하여 플래그를 출력시켜 준다.
scanf함수를 잘보면 해당 변수의 주소를 가리켜 주는 &가 빠져있다.
그로므로 해당 scanf함수는 인자로들어간 변수들의 주소값을 입력시킬 수 있는것이다.
welcome 함수를 잘보면 name변수의 시작주소가 ebp-0x70인것을 알 수 있다.
ebp-0x70부터 100을 더하면 ebp-0xc가 된다. name변수를 통해 입력해줄 수 있는 구간은 ebp-70x ~ ebp-0xc이다.
login함수에서 passcode 입력하는 부분이다.
passcode의 시작이 ebp-0x10이다. 이것을 통해 name변수와 입력하는 passcode의 주소가 ebp-0x10 ~ ebp-0xc로 4byte 겹친다는 것을 알 수 있다.
또한 scanf함수에서 &passcode1이 아니라 passcode1 를 사용한다.
정리를 해보면 name에서 name[96], name[97], name[98], name[99] 즉 마지막 4바이트는 passcode1이 가리킬 주소로 설정이 가능하며, 이후 scanf를 통해 해당 주소값을 변경 시켜줄 수 있다. ==> got overwrite가 가능하다.
name에 96bytes 는 아무값이나 넣어주고 마지막 4바이트는 scanf다음에 호출하는 함수인 fflush 함수의 got를 넣어준다. passcode1의 주소가 fflush함수의 got를 가리키고 있는 상황에서 scanf함수를 통해 플래그를 출력해주는 if문 안의 주소로 변경해준다.
그러면 fflush함수를 실행시킬때 plt를 통해 정상적으로 got를 호출하지만 변경된 got를 통해 if문안의 주소를 호출하게 될것이다.
페이로드 작성을 위해 필요한것
fflush got
fflush의 got는 0x804a0080이다.
이동시킬 주소
이동시킬 주소는 0x080485e3이다. system함수의 인자가 들어가야하기 때문이다.
scanf에서 passcode1의 값을 %d 즉 10진수 정수형으로 받기 때문에 0x080485e3을 10진수인 134514147로 입력시켜준다.
입력받는 데이터의 길이를 잘 파악 해야한다.
원하는 주소값을 변경할 수 있으면 got overwrite가 가능해진다.
'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글
brainfuck (0) | 2018.12.21 |
---|---|
asm (0) | 2018.12.21 |
horcruxes (0) | 2018.12.21 |
cmd1 (0) | 2018.12.21 |
leg (0) | 2018.12.19 |