일단 위의 소스코드를 보면 scanf로 값을 입력받는 부분의 변수가 전부다 &이 빠져있는 것을 볼 수 있다. 이러한 경우에는 변수에 값을 저장하는 것이 아니라 변수의 주소를 지정하게 된다. 따라서 이러한 오류를 이용하여 flag를 얻어내자!
1)
2)
1번의 0x0804862f를 보면 edx를 ebp-0x70의 공간만큼 간접 참조?를 하고 있는 것을 볼 수 있다. 그리고 0x08048632를 보면 edx는 scanf에 의해서 값을 입력받게 되는 것을 알 수 있다.
2번의 0x0804857c와 0x0804857f를 보면 ebp-0x10의 공간을 간접 참조하는 것을 알 수 있다.
여기서 중요한 것은 1번에서 scanf로 입력받은 값중에 마지막 0x10 즉 4바이트는 passcode의 주소가 된다. 따라서 자신이 passcode의 주소를 원하는 걸로 바꿔서 passcode의 주소 안에 있는 내용?정보?를 바꿀 수 있다. 여기서 알아야 하는 정보는 바로 plt와 got이다. 이것은 따로 설명을 하고 여기서는 알고 있다는 전제하에 진행하겠다. passcode에 앞으로 쓰일 함수(login함수 내부 중 scanf로 passcode1의 주소에다가 값을 입력받는 부분 이후)의 got의 주소를 입력한다.
위의 사진을 보면 passcode1, 즉 우리가 입력한 got의 주소안에 10진수의 값을 넣을 수 있다. 이것을 이용하여
if문을 건너띄어 system("/bin/cat flag");를 실행시킬 수 있다.
방법은 우선 login함수 내부 중 scanf로 passcode1의 주소에다가 값을 입력받는 부분 이후에 쓰일 함수의 got의 주소를 welcome함수 내부에 있는 name이라는 변수에 100바이트를 입력 받을때 마지막 4바이트에다가 입력한다. => scanf("100%s", name);부분에서 마지막 4바이트를 got의 주소를 넣는다.
그런 다음 scanf("%d",passcode1);에 자신이 이동하고 싶은 주소를 입력한다.
그러나!!! 여기서 또 중요한 점이 있다!!!(두둥!!!)
그것은 바로~!
(python -c 'print "A" * 96 + "got의 주소" + "자신이 실행시키고 싶은 주소"') | ./passcode 의 형식으로 해야 된다는 것이다!!!
왜 그래야 되는 지는 좀 더 공부를 해야 될 것 같다!!!!