LEVEL 14: RTL2, only execve
이번엔 RTL 기법을 사용함과 동시에, payload에 execve 함수 주소를 반드시 사용해야 한다.
우선 복사본으로 execve 함수의 주소를 구해보자.
0x400a9d48이라고 표시된다.
분명 맞는 공격인데도, execve 주소를 인식하지 못한다. \x0a를 \x00로 인식하는 버그 때문이다.
`python ...`을 ""로 한번 더 감싸주면 해결된다.
이제 payload를 구성하자. execve 함수 주소를 넣긴 하지만, NULL의 주소를 주어 실제 사용은 안하고,
system("/bin/sh"); exit();로 대체하려고 한다.
buf[40]+sfp[4]: dummy 값
main ret[4]: &execve = 0x400a9d48
execve ret[4]: &system = 0x40058ae0
system ret[4]: &exit = 0x400391e0
system 함수의 argv[1]: &"/bin/sh" = 0x400fbff9
&execve 함수의 인자: &NULL = 0xbffffffc (특수한 경우가 아니면 이 영역은 항상 NULL이다.)
&system, &exit, &"/bin/sh"는 모두 여기에서 구한 것을 재활용했다.
'[Wargame Write-up] > Lord of Buffer Overflow' 카테고리의 다른 글
| [LoB RedHat 6.2] LEVEL 16: assassin -> zombie_assassin (0) | 2016.10.22 |
|---|---|
| [LoB RedHat 6.2] LEVEL 15: giant -> assassin (0) | 2016.10.19 |
| [LoB RedHat 6.2] LEVEL 13: darkknight -> bugbear (0) | 2016.10.19 |
| [LoB RedHat 6.2] LEVEL 12: golem -> darkknight (0) | 2016.10.19 |
| [LoB RedHat 6.2] LEVEL 11: skeleton -> golem (0) | 2016.10.18 |