매우 재미있는 문제를 풀었다
바로 이대진 선배님의 과제였던 ssp문제이다
이것은 eip를 41414141로 조작하는 문제이다
메인이 없는 것 같아 보일때는 아이다에서 start에서 마지막에 0x804865c로 가는 것을 볼 수 있는데, 이곳이 메인임을 알 수 있다.
일단, 0x804865c에서 read를 하여 입력을 받는다, 이때, i=strchr(&v3,58)을 하게 되는데, 이는 v3의 주소에 적힌 값에서 :가 있는 곳의 주소를 i에 넣는다.
for문에서 중간에 i만 있는데, 이는 i가 참일때까지, 즉 null이 아닐때까지 i는 i+2가 되어 반복을 한다.
0x80485bd를 보면 a2-a1+1을 하게 될때, a2는 :가 있는 곳의 주소고, a1은 v3의 주소 이므로, a2-a1+1은 처음부터 :까지의 길이이다. 그만큼을 malloc으로 자리를 만들고, memcpy를 이용해서 그 만큼(처음부터 : 직전까지의 길이)의 v3를 복사해준다. 그 다음 이를 atoi, 즉 정수로 만들어 v4에 넣고 리턴한다.
그 리턴값과 v3의 주소값을 더한 주소에 :나오는 주소+1한 곳의 1byte를 넣어준다.
즉, 1byte를 바꿔줄 수 있는 것이다.
v2는 i+2를 해준다.
그래서 eip가 될 곳과 처음 read가 되어 들어가는 곳의 주소 차이는 0xbffff46c-0xbffff3f8(이 주소는 바뀔 수 있다. 하지만 차이는 안 바뀐다)=116인데
v3의 주소값인 0xbffff3f8에 더해주는 리턴값이 116이면 0xbffff46c를 바꿔줄 수 있게 된다.
그래서 116:A가 되면, 0xbffff46c에 A가 들어가게 된다. 그 다음 117:A를 하면 0xbffff46d에 A가 들어간다.
eip를 0x41414141로 바꾸어야 하므로 116:A117:A118:A119:A를 넣어주면 끝난다.
그 다음은 : 가 없기 때문에 i가 null이 되어 반복문을 빠져 나오게 된다.