passcode를 실행하면 이름, passcode1, 2를 입력받는다.
C소스를 보면 welcome함수에서 이름을 크기 100짜리 배열에 입력받고 login함수에서 passcode1, 2를 입력받는데 &가 빠진채로 입력받는다.
원래는 passcode1,2의 주소를 알려줘야되니까 &passcode1이 되어야 하는데 &가 빠진것.
gdb로 열어보면 name이 ebp-0x70 ~ ebp-0x10이고 passcode1이 ebp-0x10인데 int니까 ebp-0x10 ~ ebp-0xc가 되서 name과 겹치게 된다.
근데 입력받을 때 &를 빼고 scanf를 사용하니까 name을 입력한 값이 주소가 된다.
즉 name에서 끝에 4바이트 값을 aaaa를 넣으면 passcode1에서 주소를 aaaa로 인식하게된다.
따라서 passcode1을 입력하면 그 입력값이 aaaa주소로 저장되는 것.
키 값을 보기 위해 system("/bin/cat flag")가 실행되게 해야하는데 &가 빠진것 때문에 if문을 통과할 수가 없어서 그 전에 실행되는 fflush(stdin)의 got를 system함수를 호출하는 주소로 주어서 실행되게 한다.
got주소가 0x804a004이고 system함수 호출 부분 주소가 0x080485e3니까 A*96 + 0x804a004 + 0x080485e3를 입력한다.
'Write Up > Pwnable' 카테고리의 다른 글
[Pwnable.kr] cmd2 (0) | 2018.02.12 |
---|---|
[pwnable.kr] cmd1 (0) | 2018.01.29 |
[Pwnable.kr] lotto (1) | 2018.01.21 |