精华内容
下载资源
问答
  • 我正在尝试修补一个十六进制文件。我有两个补丁文件(十六进制)名为“patch 1”和“patch 2”要修补的文件是一个名为“file.bin”的16MB文件。在过去的6到7个小时里,我尝试了很多不同的方法来找出如何做到这一点。我...

    我正在尝试修补一个十六进制文件。

    我有两个补丁文件(十六进制)名为“patch 1”和“patch 2”

    要修补的文件是一个名为“file.bin”的16MB文件。

    在过去的6到7个小时里,我尝试了很多不同的方法来找出如何做到这一点。我可以整天在文件中写入字符串,但我正在尝试执行以下操作:

    用读取字节打开patch1.bin

    打开带有读取字节的patch2.bin

    用写字节打开file.bin

    我想查找位置0xc010和0x7c010,并应用patch1.bin

    然后我想寻找0x040000并应用patch2.bin

    所以总而言之,我将应用3个补丁,然后关闭“file.bin”

    如果有人给我举个例子,我会非常感激的:)

    我先试试这个:patch1 = open("patch1", "r");

    patch2 = open("patch2", "r");

    main = open("file.bin", "w");

    main.seek(0xC0010);

    main.write(patch1);

    main.seek(0x7C0010);

    main.write(patch1);

    main.seek(0x40000);

    main.write(patch2);

    main.close();

    但被告知我正试图在一个文件中写入一个字符串,而这确实不是我想要的,哈哈

    然后我试着说:infile1 = open("patch1.bin", "rb")

    new_pos1 = int("0x00", 16)

    infile1.seek(new_pos1, 0)

    infile2 = open('file.bin', 'wb')

    new_pos2 = int('0xc0010', 16)

    infile2.seek(new_pos2, 0xc0010)

    chunk1 = int("6FFFE0", 16) #this is how long patch1 file is

    data1 = infile1.read(chunk1)

    with open("file.bin", "a") as outfile:

    outfile.write(data1)

    但它也不起作用,因为无论我尝试了什么,我都无法让它以正确的偏移量写入数据。

    我确实设法将patch1写入file.bin,但它没有在正确的偏移位置进行修补,事实上,它删除了file.bin,只是将patch1复制到其位置。这当然是错的。

    我必须提醒你,我对python和编程还不太熟悉,但我确实在努力钻研它并学习它,所以任何好的例子都会被检查,希望对我来说都是一个很好的学习课程:)

    谢谢你们帮我找出我做错了什么:)

    展开全文
  • 前言在最近的几年,Linux面临的一...执行二进制文件后从磁盘删除自身。2.在不写入磁盘的情况下直接将代码注入正在运行的服务器(例如,在PHP服务器通过易受攻击的输入来运行PHP代码)。3.使用诸如ptrace()之类的系统调...
    d0411583aebdceace671f07ac29905e1.png

    前言

    在最近的几年,Linux面临的一个日益严重的威胁—-基于无文件落地型的恶意软件。无文件恶意软件是指将自身注入到正在运行的Linux系统中,并且不会在磁盘上留下任何痕迹。现在已经有多种手法可以实现无文件攻击:

    1.执行二进制文件后从磁盘删除自身。2.在不写入磁盘的情况下直接将代码注入正在运行的服务器(例如,在PHP服务器通过易受攻击的输入来运行PHP代码)。3.使用诸如ptrace()之类的系统调用附加到正在运行的进程,并将代码插入内存空间执行。4.使用诸如memfd_create()之类的方法在RAM中创建一个可以运行的匿名文件。

    在本篇文章中,我们将讨论如何检测最后一个攻击向量。

    memfd_create()无文件攻击

    首先,向大家介绍一个linux系统的底层调用函数memfd_create()。该函数允许您在RAM中创建驻留文件,将文件保存到RAM而不是文件系统本身。调用成功后,您就可以引用这个内存驻留文件,就像您操作磁盘目录中的文件一样。 在man中的描述:

    memfd_create()创建一个匿名文件并返回引一个文件描述符。该文件的行为类似于常规文件,并可以进行修改,截断,内存映射等。但是,与常规文件不同,它位于RAM中并且具有易失性。

    您可以将其理解为并不是在Linux主机上直接调用/bin/ls,而是将ls加载到RAM中,可以将其称为/ls。就如许多系统调用一样,出于性能等原因,它可以被合法使用,但这也给攻击者带来了可乘之机。更重要的是,如果系统重新启动或被关闭,恶意软件会立即被清除,这对于隐藏入侵者行为来说是很有价值的。

    发动进攻

    关于memfd_create()的利用方式有很多种,它们都有相似的检测模式,所以使用哪种并不重要,在本文我们使用的是:In Only Memory ELF Execution。

    我们可以直接通过SSH传输二进制文件,这样就没有任何内容写入磁盘,也没有产生任何交互式shell,这样做可以大大降低攻击被检测的可能。

    78fdcf2c78fe6c31b0bb49b0f98c8278.png

    攻击通过SSH将bindshell后门发送到目标靶机并进行执行。运行后代码将在靶机上驻留并打开一个侦听端口等待连接,入侵者可以在远程主机上执行的任意命令。

    快速检测无文件Linux攻击

    针对文章中演示的示例可以通过一个简单的ls和grep命令进行检测:ls -alR /proc/*/exe 2> /dev/null | grep memfd:.*(deleted)

    此命令将遍历/proc目录中所有正在运行的进程,并检查它们是否具有格式为memfd:(deleted)的可执行路径。这个条目非常可疑,并且在无文件攻击中很常见。

    运行此命令后,正常情况下不应有任何回响。如果您看到有任何结果返回,则应立即调查该过程。当然有时会有误报的风险,但是对于这种类型的攻击,很少见到(如果有示例,请与我们联系)。

    e346ae17554ecaed86eff74ebc559bb5.png

    执行命令后显示了以下目录条目:lrwxrwxrwx 1 root root 0 Jul 8 23:37 /proc/14667/exe -> /memfd: (deleted)在路径中,进程的ID(PID)为14667,这是我们需要重点关注的对象。

    如果攻击者已经使用了完备的方案实现了对二进制文件的隐藏,那么以下的策略可能会失效。但是对于常见的攻击,使用这种方法是快速有效的。

    使用命令行进行攻击取证

    在本例中,bindshell启动后会立即绑定到TCP 31337端口,执行反弹shell操作,开始发送盗取的敏感数据等。我们可以先使用netstat和ps命令收集攻击信息。

    通过netstat命令,我们注意到了一个反常的tcp端口,该端口的进程名也很奇怪:netstat -nalp

    34807f225ef557b2d3df4144a84977bb.png

    如上图所示,该进程的PID为14667。下一步通过PS命令查看该进程一些具体信息:ps -auxw

    8f342ec6da6cf795400b20cf8a59f7a4.png

    我们在进程列表中,看到它的进程名为[kwerker/0:sandfly],这将帮助它隐藏在具有相似名称的合法进程中。您可以在上面的列表中看到,如果不使用sandfly标识符进行命名,我们真的很难发现它。

    现在我们已经找到了可疑进程,下一步就要想办法获取该进程的具体信息。由于接下来大多数操作将在/proc目录中进行,让我们先转到/proc/目录,其中PID是我们的可疑进程ID。您可以使用以下命令进入该目录:cd / proc / 14667

    进程目录列表

    在进程目录中,我们可以使用ls命令列出文件夹中的内容。Linux内核将实时构建目录,并向我们显示许多有价值的信息。ls -al

    118e85e3aa5732c6a42b402c5aec5e50.png

    通过简单的ls命令我们可以获知:1.进程启动时的日期戳。2.当前的工作目录(用户最有可能在/root下启动进程)。3.EXE链接指向一个已删除的二进制文件的位置。

    最重要的一点是,在Linux上,除了少数用例外,具有deleted标记的二进制文件的进程通常是恶意的。而且,该进程不仅被删除,还指向一个非常不寻常的位置了/memfd:这是攻击所使用的内存文件描述符。

    使用Comm和Cmdline参数查找隐藏的Linux进程

    在/ proc目录下的comm和cmdline文件会记录进程的命令名和进程的完整命令行信息,这是一个很好的切入点。

    当启动进程时含有参数时,会在各个参数中使用字符’’进行分割。所以当我们使用cat命令查看cmdline文件内容时,只能打印出第一个参数,即进程名。所以我们可以使用cat命令查看comm文件,使用strings命令来查看cmdline文件。cat commstrings cmdline

    comm和cmdline文件显示以下内容:

    85a7a3e64b9d98fbb9e763c669186ee0.png

    在在Linux中,大多数情况下,文件应当显示一个基本上相互匹配的二进制名称。例如,如果您在nginx这样的web服务器上运行此程序,您将在这两个文件中的某个位置看到nginx名称。但是在这个示例中,comm文件中只是一个数字“3”,这是进程伪装的一种手段。同样,cmdline文件夹中的内容也很奇怪。这两个文件并未正确记录进程名称。

    通过进程映射来验证二进制名称

    /proc/[pid]/maps文件可以显示进程的内存区域映射信息。在这里也可以找到二进制名称,以及运行时正在使用的其他库文件。通常,该文件的第一部分包含对正在运行的二进制文件的引用(例如/usr/bin/vi)。但是在文件中,我们再一次看到了对/memfd: (deleted)的奇怪引用。

    cat maps

    c18e6532ed4817229d3a445a45b3b36e.png

    调查Linux进程环境

    很多人可能会忽略在Linux上,当你启动一个进程时,它通常会附加一系列环境变量。在大多数情况下,由用户启动的任何进程都会出现在这里。我们试图通过查看/proc//environ文件夹获取进程信息。

    同样,出于格式化的原因,我们将使用strings命令,这样更易于阅读。strings environ

    31ef21691b429efdefbb82e3681b4c63.png

    既然我们的恶意软件是通过SSH传入的,纵使攻击者设法清理的有关IP地址的日志,但是启动进程时还是会留下蛛丝马迹。

    抓取二进制文件

    即便二进制文件没有在磁盘上存在,但是我们仍可以非常便捷的恢复注入的二进制文件。具体的操作细节我已经在关于恢复已删除的二进制文件的文章中进行了全面介绍,在这里只进行简述。

    cp /proc//exe /destination_dir/filename在本示例中,命令如下:cp exe /tmp/malware.recovered

    该文件被恢复到/tmp/malware.recovered下。您可以像往常一样对恶意样本进行分析,还可以为二进制文件生成hash值:sha1sum exesha1sum /tmp/malware.recovered

    bcf6068f7ea891434fa257017a9fc3e6.png

    收集到的信息

    到目前为止,我们收集到了如下信息:1.可疑的可执行文件的路径。2.进程使用的端口号。3.进程名。4.comm和cmdline文件中没有引用相同的命令名。5.comm文件内容只有一个字符长。6.进程当前的工作目录位于/ root下。7.进程试图链接已被删除的/memfd位置,而不是合法的二进制路径。8.进程映射文件显示相同的已删除位置。9.恶意软件是通过SSH传入的

    11907706853805850ff8c97d5c3f1b7f.png

    事实上,Linux并不会刻意隐藏任何信息。它们就像屋檐上的观察者一样,或者就像我们在Sandfly上所说的那样:试图隐藏正是一种入侵的特征。

    本文翻译自 sandflysecurity.com, 原文链接 。如若转载请注明出

    我是安仔,一名刚入职网络安全圈的网安萌新,欢迎关注我,跟我一起成长; 欢迎大家私信回复【入群】,加入安界网大咖交流群,跟我一起交流讨论。

    小白入行网络安全、混迹安全行业找大咖,以及更多成长干货资料,欢迎关注#安界网人才培养计划#、#网络安全在我身边#、@安界人才培养计划。

    a3b340174a95171f051f79ebd55ec794.png
    展开全文
  • 题目:编写程序从一个二进制文件中读入若干个字节,将每一个字节的8位逆转后,按字节的输入顺序输出到另一个二进制文件中。这里的逆转是指:当unsigned char k=0xAC(二进制值为:10101100),逆转后k为:00110101...
  • 最后,为什么只有在我尝试使用16位二进制文件时才会发生这种情况? 编辑:尝试8位时,我得到以下内容: >>> c = 00000001 >>> d = 10000000 >>> c | d 10000001 您没有告诉Python您要输入二进制数;像C一样,Python...

    我正在学习python中的按位运算符,因此我尝试在shell中进行一些实验。 我尝试使用8位数字进行位操作,这似乎正常工作,但是如果我尝试使用16位数字,则会发生这种情况:

    >>> b = 0010000000000000

    >>> b

    549755813888

    如果我尝试更大的数字,那么输出一开始看起来很正常:

    a = 1011110110011001

    >>> a

    1011110110011001

    >>> b = 1100001110000101

    >>> b

    1100001110000101

    但是当我应用按位运算符时,例如OR |,,那么我又得到了一个十进制输出。

    >>> a | b

    1125874135965693

    我觉得这很令人困惑。 二进制运算符的结果不应该是二进制吗? 如果是这样,转换在哪里发生? 最后,为什么只有在我尝试使用16位二进制文件时才会发生这种情况?

    编辑:尝试8位时,我得到以下内容:

    >>> c = 00000001

    >>> d = 10000000

    >>> c | d

    10000001

    您没有告诉Python您要输入二进制数;像C一样,Python会将0010000000000000解释为八进制(8 ** 13),并将1011110110011001解释为十进制。请改用0b前缀和bin函数:

    >>> a = 0b1011110110011001

    >>> b = 0b1100001110000101

    >>> bin(a|b)

    '0b1111111110011101'

    您的8位值(Python也不知道,int通常为32位或64位,但是最新版本将无缝过渡到可以扩展到任意宽度的long值)的值的解释方式完全相同。无论前面有多少个零,无论在哪个底数中,其他数字都是偶数,1都是1。尝试100 | 1000(产生1004)作为一个失败的低示例(实际值为0b1111101000和0b1100100)。

    这是有道理的,但是解释器会自动将8位识别为没有0b前缀的二进制吗?

    您可能想发布一个您认为可行的8位值的示例。

    病态更新问题以包含示例

    尽管仅使用1和0,但这不会使您输入的数字成为二进制数:它们是十进制的(如果以0开头,则是八进制的)。

    如果要使用二进制数,请在它们前面加上0b(至少假定Python 2.6)。看到这个问题。

    如果要打印结果,您可能还会发现bin()很有用。

    EDIT: I get the following when trying 8bits:

    >>> c = 00000001

    >>> d = 10000000

    >>> c | d

    10000001

    您仍然对0b表示法感到困惑。 10000000不是8位数字,它是一个十进制数字,您至少需要24位才能表示它(bin(10000000)是0b100110001001011010000000)。

    10000000 | 00000001似乎是"工作"的,就好像它是二进制表示形式一样,是因为00000001(它是八进制表示形式)也恰好是十进制的1。这确实是0b100110001001011010000000 | 0b000000000000000000000001。

    例如,00000010是十进制的8,因此10000000 | 00000010将是10000008。如果您的数字以0开头,则为八进制表示形式;如果以0x开头,则为十六进制;如果以0b开头,则为二进制;否则为十进制。

    您的特定用例(10000000 | 1)有点运气。尝试10000000 | 1000,您的假设将不再起作用:那就是10000360。

    您正在使用的操作是按位的,但是您提供的数字中的1并不代表单个位。

    您可能希望看到的是:

    >>> bin(0b10000000 | 0b00001000)

    '0b10001000'

    在这里,您提供的数字是二进制格式(0b...),操作是按位的(其他表示法也是按位的,只是被激活的位不是您认为的那些),然后您将使用bin(...)将其返回为二进制表示形式。

    要在Python中编写二进制文字,您需要在文字前加上0b前缀。与a = 0b1011110110011001中一样。有关更多详细信息,请参见此问题。

    展开全文
  • 本节是从全局了解go语言的最后一篇,关于如何打包可执行二进制文件。 一、配置环境变量 go env -w GOBIN=/Users/leiteng/study/go 二、go install 命令打包安装可执行二进制文件 cd到hello目录,执行go ...

    通过前面的学习,我们已经了解了模块开发的相关知识、在另一模块中调用、多返回值处理、kv返回值处理、异常处理、添加单测等相关知识。

    本节是从全局了解go语言的最后一篇,关于如何打包可执行二进制文件。

    一、配置环境变量

    go env -w GOBIN=/Users/leiteng/study/go

    二、go install 命令打包安装可执行的二进制文件

    cd到hello目录,执行go install 命令

    三、可执行二进制文件的安装目录

    因为我们配置了GOBIN,因此执行go install 会把Hello.go打包安装二进制文件到GOBIN目录下

    三、查看效果

    打开命令行,输入Hello回车,可以看到正确输出,说明已经安装成功可执行二进制文件。

     

    后续:会从三个方向对go语言进行深入的了解学习。go语言的基本语法和数据结构、方法和接口、go的并发原语。

    展开全文
  • 参考OpenTSDB的服务端编译方式,将我们数据库的服务端编译成可执行二进制文件。 类似直接运行./dst就能启动服务端。 该问题待解决。
  • Android 使用NDK编译二进制文件并运行

    千次阅读 2015-11-19 11:14:19
    Android 使用NDK编译二进制文件并运行本文介绍如何编译可以在Android平台上运行的二进制可执行文件。 首先我们,知道,Android是基于Linux的,而在Linux上,可以执行二进制文件,那么如何在Android上执行二进制文件...
  • 1.linux0.11是如何加载并执行一个二进制可执行文件和shell...加载并执行一个二进制文件或脚本的主要函数是do_execve(),其主要功能为: a. 执行对命令行参数和环境参数空间页面的初始化操作------设置初试空间起始指
  • 我们学习如何修改默认的启动脚本,如,JVM启动参数 -D启动系统配置,JVM内存等。 这个章节要确保我们使用的Spring Boot版本是1.3以上。如果不是的话,请在build.gradle加入以下代码。(注意,我们自己创建的db-...
  • 当然不管是文本文件还是可执行文件,本质上都是二进制文件。因为计算机跟我们人不一样,它只能读懂二进制文件。 什么是二进制? 说起二进制,大家可能觉得很神秘。但是我要说,这其实没什么神秘的。 如果当初由你来...
  • <p>I use cross compile to compile a linux version binary on Mac.... <pre><code>GOOS=linux GOARCH=amd64 go build </code></pre> <p>Also tried the other command that I found on stack overflow....
  • 最近下载了一个C语言编写的算法程序,解压后为可执行文件。 我想得到该算法的源代码,应该如何操作呢? 本人新手,望各位大神指教? 附:链接为算法源程序下载地址,麻烦大家了 [url=...
  •  其实,这些二进制文件我们也可以通过编译fabric和fabric-ca的源码得到。下面我们就来说说怎么编译得到它们。 01 下载fabric源码  用git把fabric源码从github上克隆下来 $ mkdir -p $GOPATH /src/...
  • 今天接手新的模块开发时,发现他们给我的归档脚本中有很多乱码,但是也能正常... uuencode 将二进制文件进行编码,编码后的资料都以 begin 开始,以 end 作为结束。 uudecode 将 uuencode 编码后的档案还原, uudec
  • 用命令行解释.py文件,编译生成pyc和pyo二进制文件 初学Python第一步就是如何使用命令行运行.py文件 在终端执行python ~/Destop/1.py命令,终端就可以解释运行我们的python程序了。 我们也可以直接使用命令: ./...
  • 一个小的二进制文件,用于在终端中显示pacman镜像列表的状态 如何 ? milcheck只是读取您的/etc/pacman.d/mirrorlist并从官方检索相应的数据 为什么 ? 如, 在进行系统升级(即sudo pacman -Syu ,必须检查您的...
  • 在dist文件夹下生成了一个UNIX可执行程序和一个app程序。图标并没有变成设置的图片 ![图片说明](https://img-ask.csdn.net/upload/202002/10/1581309554_284293.png) 其中unix程序双击会先弹出命令行然后程序...
  • 然后go build可以将代码转换为本地可执行二进制文件。 由创建 要求 为了构建“ basgo-build”编译器,需要Go的最新版本。 如果您的系统缺少Go,则此食谱将安装Go的当前版本: git clone ...
  • 如何制作二进制安装包

    千次阅读 2019-07-06 14:48:59
    如何制作二进制安装包 ...起始脚本,用来和压缩包进行合并生成二进制文件的,命名为init.sh(也可以自主命名) #!/bin/bash export TARGET_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )...
  • ====================================...=======================================打包可执行文件步: Linux 下不混淆代码直接打包为可执行文件:make tcl Linux 下将用 Tcl Dev Kit 混淆加密代码后...
  • 如果我们有关于您的程序如何工作的更多信息,我们可以提供有关如何自动执行该程序的更好建议. 您可能希望在各种补丁状态(和unpatch)中跨预期的部署目标使用一组VM映像.对于某些应用程序,您需要为IE的每个变体使用单独...
  • 1.mysql的简介 Mysql是一种关系型数据库,特点是将这些数据保存在不同的二维表中,并将这些表放入数据库,这样可以增加它的读取速度。 2.mysql的事务 ...1)在主库上把数据更改记录到二进制(Binary
  • 满意答案jingle_feng2016.11.24采纳率:46%等级:12已帮助:17564人mysql命令行下怎样实现数据的回滚操作在MySQL有时执行了错误的update或者delete时导致大量数据错误恢复的办法。...使用sqlbinlog会产生bin文件,恢...
  • Supersu打开后提示“SU二进制文件需要更新”或“未安装su二进制可执行文件,而SuperSU也无法安装它。您的设备可能没有获得root权限”,这二进制文件究竟是什么意思呢?又要如何解决呢?下面跟下载吧小编一起来看看...
  • 我的案子:多个lambda函数返回json(文本),只有一个lambda返回二进制文件。所有服务器都启用了lambda proxy。lambda位于API网关中API网关位于CloudFront之后提示:我注意到API网关中的一个重要信息-&gt;设置...
  • 本篇文章给大家带来的内容是关于如何将Python脚本打包成可执行文件?(详细),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。Python是一个脚本语言,被解释器解释执行。它的发布方式:.py文件:...
  • 文章目录什么是二进制兼容?为什么需要二进制兼容?哪些常见做法会破坏二进制兼容?...所谓二进制兼容就是在做版本升级(也可能是Bug fix)库文件的时候,不必要做重新编译使用这个库的可执行文件或使用这个库的...
  • 新链接器将能加速构建效率,并且能一定程度减小生成的二进制执行文件的大小。此外,Golang 1.5还在语言运行时性能,支撑体系结构,标准库做了变化。概述自从Golang1.0发布以来,Go团队一直在每个版本中对工具和标准...
  • 今天在看mysql数据同步的时候,看到有人问,如何规范清理二进制日志文件,并且保证同步不会出现问题. 看了一下资料,发现了以下的一个方法,感觉比较好, 在数据库(从属数据库上面)上面执行下面命令: mysql> PURGE...
  • 基本概念编译器,解释器抽象语法树字节...编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,174
精华内容 469
关键字:

二进制文件如何执行