存在条件竞争,可以多次卖出高价值物品,重复即可得到249元从而购买flag。
1 | from pwn import * |
qemu题目,根据launch.sh文件中--device FastCP
确定关键词,再通过在ida里面搜索即可得到相关函数。
漏洞点存在于fastcp_cp_timer函数中:
通过cmd为4进行泄漏得到pie地址和CP_buffer,再通过cmd为1设置cp_timer为system函数地址,并覆盖其指向CP_buffer上存储命令的地址,再次执行即可获取flag。
exp:
1 |
|
上传:
1 | #!/usr/bin/env python2 |
tea加密相关的,抄代码,然后将顺序调换即可:
1 | int decode(int a2) |
根据题目提示直接搜索rootkit即可在附近发现flag:
流量包中可以发现两个密文:
因为只是padding不同,且位数较短,利用Franklin-Reiter攻击方法,在sage上执行代码即可获得flag
1 | #脚本2 |
压缩包的密码是压缩包名,写个脚本循环解压:
1 | import zipfile |
最后会解压到 unknown.zip,用Python的 randcrack 库,首先在前面的解压中把随机数整理后得到:
1 | 2907706324, 3954914986, 3402108112, 2054213659, 535557466, 3669544554, 2651712950, 3417770286, 4111425735, 3450915372, 3509237967, 2707743668, 889955106, 101861478, 1336215387, 3605515990, 2504989551, 1349201253, 2648082710, 2601629531, 318049225, 645746114, 3181236701, 1354915347, 4222461704, 843752451, 304987850, 818779778, 2376864436, 4258684562, 3790514089, 2536866185, 3429670676, 700863894, 2368789662, 2954948787, 1850501693, 1935300318, 4294954886, 73605939, 790901430, 3142640071, 3691984007, 1373060993, 903416285, 3121969731, 1482630290, 3383153547, 4063302022, 3991027797, 4137420745, 3132346033, 1308129484, 3547926414, 3109764388, 708591644, 1817081225, 2668947004, 4263919904, 1115482359, 3856868064, 2830700281, 2281684679, 690656972, 1556659173, 3404632260, 3760484167, 1087153620, 4194906349, 1078862195, 2976233215, 1912726912, 30407312, 3942988489, 3908451981, 3898279239, 3281283879, 3497758064, 2782905320, 2430005846, 2035396750, 4225190092, 2269868098, 3586253265, 941460198, 714278381, 3535781796, 224084415, 1439629664, 4073938538, 3695945333, 3790821082, 1641312648, 3482321608, 3915303085, 1915159805, 3430976961, 1840044358, 3171835875, 2774047027, 1987332515, 3855846206, 2973653262, 3838867780, 611114104, 226329481, 1915513324, 3700256481, 43035897, 497049019, 4217044844, 2614275824, 744712097, 182795116, 2163976688, 4263470614, 725414906, 921626470, 3746191361, 1308296962, 1147642242, 4092217985, 3542284802, 1521845264, 2075371081, 816611597, 3041634562, 233907246, 1795167862, 3915308548, 491352142, 930583074, 1708980296, 308506013, 3810969309, 3157296753, 2967229333, 1571219325, 1291393249, 1593315655, 3882964486, 1017041435, 1857378099, 1824352034, 3349753470, 674061228, 1009504030, 2542637984, 371165771, 2479782679, 1480344967, 2869593526, 1330829984, 2722781682, 283801038, 3707346602, 4001933200, 2349491114, 1250027640, 1970245425, 171593507, 826464228, 2984624889, 1700335730, 1127890176, 2298521410, 3038015291, 3114969709, 2198496951, 3020449005, 2670289699, 1384619269, 691171966, 3223611927, 2151567537, 1625186327, 2435311123, 3729455475, 2620432733, 3211878875, 241902387, 422789850, 1633356868, 244191996, 499735365, 764962662, 1681584826, 427035682, 880783233, 1389830348, 1256307054, 1454192222, 3867551829, 1911723809, 394921086, 1072555848, 3834541849, 2720240412, 4083254853, 1463684341, 2807310132, 3989708760, 4287462606, 4065391879, 2946216593, 4274887668, 960363676, 3337566213, 2138750961, 3655949854, 138734513, 128284098, 1062990215, 3761988182, 1513533102, 845839023, 1734162676, 3029907057, 3437833787, 3858879164, 2270111112, 1830381909, 1534981723, 622364075, 2734894006, 3830057679, 550477468, 2555713963, 2687705967, 397294684, 3910881510, 3725223603, 2429728499, 1711990756, 4237787834, 2814436797, 2366793701, 868414597, 2185265697, 4003527750, 510159467, 281768698, 2839069975, 414584629, 841160842, 2248608666, 3581589648, 3224270545, 2113148121, 1552518857, 3606499351, 3204575349, 1595467803, 2880744010, 1317665514, 3437941254, 110923457, 278638319, 2683805720, 2816402957, 2117760685, 4054884851, 760362861, 2010439063, 3484464314, 302788119, 1394375925, 3571572324, 2666609477, 1853851652, 3970831431, 2738683685, 2259326865, 3704336022, 1519256231, 3644881529, 104403453, 1142252920, 2572082756, 2489933602, 2709723501, 186737154, 980884132, 1865172639, 2329728320, 3876911386, 3201931453, 2772783460, 661942251, 2402901175, 3570219339, 549076455, 1690874019, 2055566646, 2662268000, 4183765260, 1452482414, 2583855929, 948034686, 2853630447, 664902618, 2764279019, 740228037, 679334472, 1068533991, 1825024640, 105521362, 2758306319, 1561107818, 2855860411, 3944090887, 1155572417, 2222936476, 2982018743, 3826797015, 993277428, 3606014829, 2651099474, 183026480, 3850093664, 1946575336, 1458018383, 919408507, 3035932662, 666805284, 2368179406, 293503818, 306642195, 1174454622, 147082512, 3045274465, 1118557200, 2280283457, 1140154721, 1589304916, 2707734613, 2687607369, 3181595711, 1786880670, 614492265, 1727186681, 616992393, 2647336831, 1328574427, 3419233391, 86915267, 791316613, 2947942465, 1207262633, 4032471359, 110173792, 580028332, 3200100754, 1443892133, 4158469394, 2866259043, 1777066304, 2631121839, 3066797076, 913793049, 500723146, 4250565153, 3140000049, 4006124671, 1557687908, 3097026744, 1600577917, 3475167182, 4190641526, 1975505102, 2746146674, 4183482895, 3942160073, 1130897678, 655001677, 1503469355, 1589952677, 289068625, 404635291, 546675708, 4243969683, 92985514, 435955479, 2070686379, 269130310, 2458267416, 230795995, 2268807924, 4152347460, 883606733, 3649663604, 1939496305, 3144082131, 1020316188, 3643489526, 991785797, 2377699574, 1064114897, 3925872718, 3153908492, 3402689587, 729363836, 3146706653, 422102318, 781824325, 2070158255, 3452344097, 1855915077, 278758154, 2809776511, 3655551017, 1427426112, 3686861685, 1715461553, 3169333119, 400766497, 849152388, 3842058653, 3324504004, 2110816760, 1993886168, 2469709606, 1634363898, 451167479, 1791892046, 3639050937, 3326490342, 3138524672, 3683265170, 1733092879, 3943402096, 3178043886, 3263958674, 2945303049, 4030290823, 3890019934, 4072034359, 1491936406, 61358117, 3877008624, 4128962903, 3153897248, 2029311561, 1711005874, 1555958789, 2460011603, 1480475039, 2029023339, 3898772821, 813779337, 3274928705, 122738867, 326424966, 2636370832, 3504714095, 4243999766, 2552626959, 1698341626, 1110935776, 3393273826, 3735680822, 3013017650, 3968600483, 3916227526, 4062882707, 4124072198, 2274124478, 2769833441, 2147761328, 3979664881, 591506957, 1000835552, 1953837853, 3630957255, 1526381419, 1320001636, 804577210, 2780887882, 57522122, 2034965857, 1092740256, 3343601480, 316588755, 856922510, 3000844043, 277993279, 2628947374, 2800837999, 3540281314, 1131935058, 2554699772, 2983012006, 3462033745, 3747092723, 2082631046, 1249369550, 1399656050, 1380244778, 3654315687, 30864042, 3601038453, 1812382865, 3977191364, 3375851263, 2615653275, 4121914158, 4067727195, 4215992615, 50813272, 3422137608, 1214655257, 2262352860, 1445338275, 1049642872, 817141685, 3537094077, 1735027729, 4235889837, 2173890300, 4024475021, 435474311, 417920911, 2752551821, 10146419, 1584825302, 2581381951, 4078884446, 2091842886, 2635154217, 1512293963, 4240561542, 2569831040, 3062146866, 2413003376, 2056726083, 137699216, 2817513365, 847863437, 1348716639, 264518910, 1581262871, 3687371459, 4081927416, 3402250258, 1538729417, 58632833, 418582971, 3579226914, 1710281441, 3968026001, 3072229268, 3255655022, 443028273, 1781242768, 845963258, 1474822808, 2287289816, 3140795568, 647767985, 3201933540, 3344108747, 3156561341, 2135178605, 3977772423, 1091627310, 3387469991, 3480076167, 998455889, 3932962822, 556790737, 3462656387, 1354331856, 331339457, 89589652, 2169976628, 499723289, 4248480190, 459434352, 1756143408, 609517004, 1625850533, 1055607475, 4078436277, 178892738, 2639443481, 1643997964, 209795222, 4031695509, 515771499, 3844892252, 1509762710, 3467911440, 2990611802, 4108349538, 1251780874, 1275943948, 2750712131, 457664709, 1234644717, 3894274138, 779659511, 1022790972, 3587520181, 4114414679, 1788862106, 784942685, 2032827515, 97699241, 502970796, 208621053, 618199448, 869691038, 1315708708, 2950393537, 316695424, 3204417376, 2157414925, 1986435697, 578058463, 2226332610, 45889470, 1939749473, 4277520616, 716509244, 3148642698, 2619738742, 395812501, 2611816764, 120484619, 3803132111, 3028743725, 3032307726, 3558459801, 2286359562, 3242070811, 2972037405, 2409275190, 333056311, 1628673919, 1222753699, 3226124314, 510049636, 1798218781, 3286822755, 2050136383, 363266297, 753159469, 1339229922, 3282010884, 3964577747, 1183093495, 3665656653, 1802113568, 586211819, 1906435982, 407943402, 3478960696, 1221962222, 2646386190, 2344832406, 3568499138, 3479343149, 1044214259, 2255694969, 2629616514, 3767094630, 366310899, 2466889679, 2533941943, 2817371332, 478094315, 3077780922, 1917154805, 3668750533, 77295478, 258422916, 3929257613, 3653596300, 749676172, 2250390103, 1052624843, 2563981631, 519704737, 2969422268, 1628120157, 4100859626, 252141936, 2978131799, 1142247725, 3804721174, 1356078034, 1198864435, 2564872115, 3858385849, 3652532995, 305266060, 482238871, 1451662628, 2189662472, 4225060244, 3266478407, 298473768, 1328477173, 1872099590, 380059855, 912553536, 2099522339, 3224313555, 2056296410, 477848639, 379190417, 3487993484, 3121969521, 2288925162, 3077843604, 1456549673, 1304340342, 2083447579, 3167117719, 3348095325, 2268107766, 1402643313, 2397212057, 1352006746, 231921187, 1313920238, 2168273889, 805130323, 2816803714, 3720840652, 3407591957, 479785258, 1217833088, 4229273758, 587760181, 1233711591, 2930015733, 3697241657, 570349524, 1000281623, 2960131310, 3941057032, 3611068081, 1929535695, 1078174814, 549556557, 2427930182, 1127864687, 3728874623, 1552852683, 246530969, 3129577778, 2828503428, 741919312, 215642980, 1167747156, 1074184265, 1803181867, 1728287989, 3994497806, 3166040995, 4102870506, 2533028438, 1554448227, 1743174913, 2757654175, 1620162669, 2326525927, 1822891531, 3118838616, 988494514, 724274952, 3466926668, 2858066332, 1508595710, 2951666140, 1637995296, 2345022808, 4293996946, 2531108812, 1393641667, 3609374661, 1294467284, 1466747081, 1787125071, 418589219, 2105433503, 2486534005, 1556969350, 4187693157, 2376356641, 2760842106, 3305118691, 2311132184, 2756948087, 3686050208, 1794448609, 2080775564, 2924248445, 2178418677, 4158669833, 3219430073, 967669386, 221829347, 730413000, 4032488141, 861524009, 3520395384, 229287210, 2928013323, 634603946, 2344109932, 2651517581, 2956026520, 3962896689, 752853056, 1576906191, 420644394, 1259665633, 1833948237, 1550770827, 2065923435, 4174111849, 3128201235, 2682226239, 3167161894, 576977612, 2487367426, 2431206872, 3390561516, 2334384070, 3436416734, 2200879126, 3180692685, 2766121590, 1064218408, 410199199, 20022323, 1718513066, 3297953226, 451443686, 2132362103, 257410781, 1541671484, 3761895270, 348365872, 816022713, 4294497492, 2625738817, 3603223866, 3078033498, 1147648777, 3514932557, 2930781580, 984846570, 4212244974, 1020179629, 3382552365, 3588342390, 2485187463, 2828961807, 4136474278, 3551225472, 4086885006, 1310692642, 2241965503, 1504390196, 1603497325, 1455103646, 366434701, 293869916, 1550592307, 4214651425, 4250886934, 1306227123, 4036718626, 2933260006, 762182112, 1830993485, 2128141366, 44628368, 2873401036, 1257136753, 3380864990, 4275919402, 789867953, 3318150127, 487054724, 3730547753, 1936887664, 171225030, 3722592745, 1340948219, 1016521820, 1447577763, 2805353516, 1417994373, 817439704, 3813079978, 1200757040, 339005780, 4232371651, 1296406800, 805088113, 2812427961, 3875582523, 4113860721, 1947280914, 3775671015, 955163233, 3603928099, 91477649, 3287607536, 4201104916, 2491411596, 460805757, 1332051516, 3368474042, 3164283116, 2874896056, 293562372, 411629539, 2220832875, 2299167075, 2579299726, 2882735860, 2668845063, 42813252, 917639463, 2216449232, 2644803904, 2031826548, 3452099002, 1103665712, 1070395870, 532734790, 4097725963, 581033399, 963298035, 823792656, 3525861586, 20973404, 2359012004, 3432019008, 2233316197, 697890212, 3568807990, 3652343610, 1398136840, 937985297, 2581792527, 2566945713, 1386694986, 2557383413, 1945328836, 1021712351, 3289407095, 2323689998, 3306271310, 3585440682, 1855892766, 2796595085, 2504479613, 1289850575, 2929745242, 2021810381, 3242210155, 3055960700, 365068549, 2513400611, 553638319, 3920510223, 2495696848, 1824819128, 1213008255, 4189990551, 1989970719, 1031033434, 531275736, 882122649, 1721700980, 3178163802, 3700771996, 1850869451, 3206165832, 1272158460, 3303927391, 4119824836, 3968831781, 3771252104, 1674478394, 530327252, 9184370, 2681387057, 1178553319, 1950066334, 3127696976, 2661749414, 1383174577, 4201508029 |
另存为 data.txt,预测下一个随机数后对 unknown.zip 进行解压,然后把新的密码 append 到数组后面,最新的 624 个数字再预测下一个压缩包的密码:
1 | import randcrack |
解压到最后一层得到文件 flag,代码会因为找不到 unknow.zip 而报错停止,打开文件 flag 即可
]]>熬到4点多,总算把题目全做完了,感谢逆向师傅lantern的帮忙,总的来说题量还是有点多的,题目也有点难度,有些题差点来不及交,还好最终做完了。
write的时候可以越界,第一次读入到0x202860处使fd非法,从而在第二次读入时会写入0,这样就可以做到写入操作。
通过read越界读取出libc,然后越界写入system地址到exit退出时调用的地址,并将参数修改为/bin/sh,退出程序即可getshell。
1 | from pwn import * |
只有一个堆块的操作,存在UAF,修改tcache结构,使获得一个指向size位(0x80)及一个指向fd的tcache,并且设置0x90的tcache为8,然后利用上面的两个tcache修改其size为0x90,并free掉,这样即可获得libc地址。
然后利用UAF申请到__free_hook
并修改为system地址,即可getshell。
1 | from pwn import * |
劫持步骤同上,达到任意地址申请的目的后,申请到environ变量获取栈地址,从而将栈返回地址覆盖为我们的rop串,实现orw。
1 | from pwn import * |
对玩家进行位移时存在溢出,可以修改下一个chunk的size位,从而实现堆溢出攻击。利用unsortbin泄漏出libc后,申请到environ变量获取栈地址,然后将栈上的返回地址覆盖为ROP串实现ORW即可。
1 | from pwn import * |
arm64位的pwn题,静态地址,存在UAF的问题,劫持链表的下一项即可实现任意地址free(需符合size检查)。
将tcache结构加入到链表中,再申请一个较小的chunk,即可实现堆溢出,然后劫持到__free_hook,并修改为system函数,即可getshell。
1 | from pwn import * |
跟2021红帽有点类似,调试出了几个函数save、stealkey、fakekey、run。run可以执行一个指针处的函数,save会为这个指针申请地址,通过特定的申请可以得到unsortbin的,stealkey会将当前的指针的值存储起来,fakekey会将上面存储的值与传入的参数相加。所以可以利用unsortbin泄漏出libc,然后用stealkey保存,fakekey计算偏移到onegadget,最后用run运行即可getshell。
1 |
|
1 | void save(char * a,int b); |
Linux内核中overlayfs文件系统中的Ubuntu特定问题,在该问题中,它未正确验证关于用户名称空间的文件系统功能的应用程序。由于Ubuntu附带了一个允许非特权的overlayfs挂载的补丁,因此本地攻击者可以使用它来获得更高的特权。
Overlayfs是一种类似aufs的一种堆叠文件系统,它依赖并建立在其它的文件系统上(如ext4fs和xfs等),并不直接参与磁盘空间结构的划分,仅仅将原来底层文件系统中不同的目录进行合并,然后向用户呈现,因此对于用户来说,它所见到的overlay文件系统根目录下的内容就来自挂载时所指定的不同目录的合集。(图源自参考文章2)
其中lower dirA / lower dirB目录和upper dir目录为来自底层文件系统的不同目录,用户可以自行指定,内部包含了用户想要合并的文件和目录,merge dir目录为挂载点。当文件系统挂载后,在merge目录下将会同时看到来自各lower和upper目录下的内容,并且用户也无法(无需)感知这些文件分别哪些来自lower dir,哪些来自upper dir,用户看见的只是一个普通的文件系统根目录而已。
但这几个不同的目录不完全等价,upper目录会覆盖掉lower目录的同名文件,而同一层的lower文件中,较上层的也会屏蔽较下层的同名文件。并且upper文件是可读写的,写入merge文件(来自upper挂载的文件)数据时会直接将其写入到对应文件;而lower文件是只读的,无论如何对merge文件(来自lower挂载的文件)进行修改,原文件都不会变(写操作时会将该文件拷贝到upper中)。另外,挂载后就不允许对原lower和upper进行操作。
总的来说是以下三点:
capability允许了普通用户拥有超级用户的权限。与sudo不同,capability可以分开赋予某种特定的权限,且不需要用到超级用户;而sudo则是所有权限都具有,并且需要用到超级用户。
用于对用户和用户组进行隔离。/proc/PID/uid_map
和/proc/PID/gid_map
文件中是关于映射设置的信息,其内容为三组数字:first-ns-id first-target-id count
。
xattr 是文件扩展属性全称是一种以key-value 保存数据到文件系统中的技术。xattr从功能上分为四类user/trusted/system/security。 这四类中system用于保存acl,security 用于支持selinux,user/trusted 提供给用户保存进程的设置。
在os中,每一个文件系统都对应一组setxattr和getxattr命令用于读写xattr。
setxattr函数最终会通过vfs调用各个文件系统实现的setxattr来设置其扩展属性。
setxattr
vfs_setxattr
security_inode_setxattr
cap_inode_setxattr
ns_capable
__vfs_setxattr_noperm
__vfs_setxattr
ovl_xattr_set
cap_convert_nscap
1 | diff --git a/fs/xattr.c b/fs/xattr.c |
总结下exp的利用思路为如下几点:
修改user namespaces,使其在另一命名空间下具有root权限,从而可以挂载overlay。
利用overlay拷贝出exp文件,并且因为当前命名空间下为超级权限,可以直接设置capability,从而赋予权限。
运行exp,提权成功。
面试的时候被问到linux内核保护模式,居然一时语塞,所以就试着去了解了下,主要借鉴参考文章1。
LSM全称Linux Security Modules,Linux安全模块,是一个在内核模块的基础上提出的轻量级的安全访问控制框架。
LSM框架只是提供一个支持安全模块的接口,本身不能增强系统安全性。通过LSM框架,安全模块层的安全模块可以非常自由地在内核里加载和卸载,不需要对内核进行重新编译。
区别与linux kernel module,至少有两个地方不同:
由美国NSA维护,基于强制访问控制MAC实现,基于角色的访问控制——进程只能访问那些存在他的任务中所需要的文件,简化用户的权限管理,减少了系统开销。
通过对用户、进程权限的最小化,即使受到攻击,进程或用户权限被夺去,也不会对整个系统造成重大影响。
由OpenSuSE/Ubuntu维护,基于MAC实现,是SELinux的一个备选,SELinux是对文件加标签,AppArmor是对文件路径,配置起来更简单,且对系统的修改少。
开始由PaX维护,后由Grsecuriyty团队维护,采用patch形式加入到linux。
linux防御机制(摘自参考文章1):
注:
绿——加入到内核主流的防御机制
蓝——Out-of-tree denfense
灰——商用防御
青——护网防御
白——通用防御机制
紫——漏洞检测
粉——漏洞
黄——漏洞利用技术
在编译时通过传入seed随机化重新排列域,缓解缓冲区溢出。(菜鸡翻译,这里是原文,下同:The randstruct
plugin randomly rearranges fields at compile time given a randomization seed. When potential attackers do not know the layout of a structure, it becomes much harder for them to overwrite specific fields in those structures. )
kaslr(内核地址空间随机化)的开关,但还需要cmdline的支持。
RANDOMIZE_BASE:每次启动都将kernel image映射在不同虚拟内存地址上。
RANDOMIZE_MEMORY:开启后将随机化线性映射区域基址、vmalloc区域基址、vmemmap区域基址。
将随机数写入latent_entropy这一全局变量,并加入到内核熵池从而增大内核熵,提高内核中密钥的变化。(This plugin mixes random values into the latent_entropy global variable in functions marked by the __latent_entropy attribute. The value of this global variable is added to the kernel entropy pool to increase the entropy.)
函数指针和敏感变量必须不可写,对于那些在init时初始化的变量可标记为__ro_after_init
属性。
通过复制现有的原子refcount实现对refcount_t的溢出保护,通过添加一条指令来检测是否为负数,例如超过INT_MAX或小于0,但检测到时,会将其设置为INT_MAX/2。(This is done by duplicating the existing atomic_t refcount implementation but with normally a single instruction added to detect if the refcount has gone negative (e.g. wrapped past INT_MAX or below zero). When detected, the handler saturates the refcount_t to INT_MIN / 2. With this overflow protection, the erroneous reference release that would follow a wrap back to zero is blocked from happening, avoiding the class of refcount-overflow use-after-free vulnerabilities entirely.)
通过添加一个机制检查返回用户态时的地址,任何尝试设置fs寄存器的线程都会被设置TIF_FSCHECK这一标志,并终止。(Check address limit on user-mode return, added a mechanism to check the addr_limit value before returning to userspace. Any call to set_fs() sets a thread flag, TIF_FSCHECK, and if we see that on the return to userspace we go out of line to check that the addr_limit value is not elevated.)
能够使BPF即时编译器更加强壮,被eBPF JIT后端支持,能缓解JIT被堆喷,但启用后会牺牲性能。(This enables hardening for the BPF JIT compiler. Supported are eBPF JIT backends. Enabling hardening trades off performance, but can mitigate JIT spraying.)
加载模块时会检查签名的有效性,如果签名不存在或者签名内容不一致,会强制退出模块的加载。(Check modules for valid signatures upon load: the signature is simply appended to the module. )
通过验证加载的模块、读取的防火墙机制、加载的安全策略等是否来自信任源,若来源不信任则不予加载。(That is the policy that LoadPin was created to implement. It takes advantage of the relatively new kernel file-loading mechanism to intercept all attempts to load a file into the kernel; these include loading kernel modules, reading firmware, loading a security policy, or loading an image for kexec()
.)
设置为Y时可以避免用户采用不同的、古老的行规程(line discipline,应该是这么翻译的)(Historically the kernel has always automatically loaded any line discipline that is in a kernel module when a user asks for it to be loaded with the TIOCSETD ioctl, or through other means. This is not always the best thing to do on systems where you know you will not be using some of the more “ancient” line disciplines, so prevent the kernel from doing this unless the request is coming from a process with the CAP_SYS_MODULE permissions.
Say ‘Y’ here if you trust your userspace users to do the right thing, or if you have only provided the line disciplines that you know you will be using, or if you wish to continue to use the traditional method of on-demand loading of these modules by any user.)
STRICT_{KERNEL,MODULE}_RWX
与用户态NX保护模式类似,将text段、rodata段设置为只读,其他非text段设置为不可执行。(If this is set, kernel text and rodata memory will be made read-only, and non-text memory will be made non-executable. This provides protection against certain security exploits (e.g. executing the heap or modifying text))
若在boot中找到可写、执行段则发出警告。(Generate a warning if any W+X mappings are found at boot.)
将叶子页表设置为只读,当需要修改时再通过创建一个临时的交替页表进行更新(It’s fairly rare that linear mappings need to be updated, so to improve security we can map the leaf page table entries as read-only, this makes it harder for an attacker to modify the permissions of the linear mappings, while the overhead is low because the linear mappings don’t need to be changed frequently. When they do need to be updated we can use fixmaps to create a temporary alternative mapping to do the update.)
x86中叫smep,arm中叫PXN。禁止内核CPU访问用户空间的数据。
x86中叫smap,arm中叫PAN。禁止内核CPU执行用户空间的代码。
设置最小可申请的地址空间,避免空指针误用。(mmap_min_addr
is a kernel tunable that specifies the minimum virtual address that a process is allowed to mmap. )
内核页表隔离,将用户态和内核态的地址空间放在不同页表中。(split the page tables, which are currently shared between user and kernel space, into two sets of tables, one for each side.)
将指令解码为microcode/Micro-Ops,这样如果出现CPU硬件错误,通过修改microcode即可。
retpoline是google开发的用于针对Spectre变种2漏洞缓解利用的技术。每次CPU在即将执行简接跳转指令时,会去询问间接分支预测(indirect branch predictor),然后投机选择一个最优可能执行的路径;而retpoline则绕过了indirect branch predictor。retpoline包括了return和trampoline,也就是在间接跳转的时候用return指令添加了一个“蹦床”,主要是使用ret指令来实现地址跳转。(As far as I can piece this together from the limited information at the moment, a retpoline is a return trampoline that uses an infinite loop that is never executed to prevent the CPU from speculating on the target of an indirect jump.)
加强分支预测的,同样是针对Spectre漏洞的缓解技术。(This config option will take CPU-specific actions to harden the branch predictor against aliasing attacks and may rely on specific instruction sequences or control bits being set by the system firmware.)
处理器与内存之间维护一个高速缓存,在通常情况下,现代处理器采用Speculative Store Bypass的优化方式提升对高速缓存的访问,但此方法会泄漏投机执行过程中相关的旁路信息,关闭该选项即可全局关闭Speculative Store Bypass优化,也可以通过调用prctl()使特定线程关闭该优化。在X86下如果要更新microcode,需要开启此选项。(Once enabled, mitigation within the guest is identical to bare-metal. User processes can use the prctl() system call and “seccomp” filtering, or system wide mitigation can be turned on with a kernel parameter.)
由内核态切换到用户态、或由hypervisor切换到guset时,对store buffer、fill buffer、load port等缓存执行flush操作,该修复需要miscocode更新支持。当处理器支持SMT时,该修复还需要配合关闭SMT,以防止同一个physical core上的另一个logical CPU重新填充这些缓存。
通过逆序存储non-present的PTE的所有bit,这样使用PFN字段字段逆序后在L1缓存中就会发生cache miss,避免被构造出PFN具有特定值的PTE,从而泄漏出L1缓存中的内容。
随机化SLAB的freelist,从而缓解堆溢出攻击。(Provides an optional config (CONFIG_SLAB_FREELIST_RANDOM) to randomize the SLAB freelist. The list is randomized during initialization of a new set of pages. The order on different freelist sizes is pre-computed at boot for performance. Each kmem_cache has its own randomized freelist. Before pre-computed lists are available freelists are generated dynamically. This security feature reduces the predictability of the kernel SLAB allocator against heap overflows rendering attacks much less stable.)
页表申请随机化,但会增大没有缓存的平台的工作量。
即不迁移slab。迁移slab会导致内核堆溢出到其他不同的cache,不迁移则能避免堆溢出影响到其他cache。(For reduced kernel memory fragmentation, slab caches can be merged when they share the same size and other characteristics. This carries a small risk of kernel heap overflows being able to overwrite objects from merged caches, which reduces the difficulty of such heap attacks. By keeping caches unmerged, these kinds of exploits can usually only damage objects in the same cache. To disable merging at runtime, “slab_nomerge” can be passed on the kernel command line.)
允许管理员禁用非特权用户使用缺页中断系统调用。
DEBUG_LIST:检查链表是否正常
DEBUG_SG:检查scatter-gather表
DEBUG_CREDENTIALS:检查指向证书的指针数是否正确,在SELinux下还会检查指向证书的指针
DEBUG_NOTIFIFERS:检查内核通知链
DEBUG_VIRTUAL:检查虚拟页表代码
当遇到内核内存数据错误时报错。
利用该变量指定的程序来执行从内核中调用用户态函数的操作。
以模块化可选的载入,用于划清用户态和内核态代码界限,防止root用户篡改内核代码。
即canary保护。
即canary保护。
在编译时检查gets、memcpy等函数操作是否会造成缓冲区溢出。但只能检查出知道变量内存大小的溢出。
仅用于检测从slub分配器分配的内存是否溢出,同时也会改变堆的结构。含多个参数取值。
在数据从用户空间拷贝到内核空间时做出检查,包括地址有效性、堆栈检查、代码段检查。
将线程信息从栈上转移到task_struct结构体中。
将使用vmalloc申请的地址作为内核栈,并利用vmalloc的guard page增强了栈溢出检测能力,且减少了内存碎片化,但这些内存在物理上可能是不连续的。
当调用schedule()时检测栈结尾是否溢出,当溢出时则发出错误。(This option checks for a stack overrun on calls to schedule(). If the stack end location is found to be over written always panic as the content of the corrupted region can no longer be trusted. This is to ensure no erroneous behaviour occurs which could result in data corruption or a sporadic crash at a later stage once the region is examined. The runtime overhead introduced is minimal.)
一方面当进程从内核态进入用户态时,擦除内核栈的信息;另一方面检查进程内核栈是否溢出。
将申请到或释放的内存初始化,避免泄漏信息。
在free时填充特定字节,申请时检查这些字节是否被修改。
用于将已经释放的内存进行擦除。
intel用户模式指令防护。在当前特权级别(CPL)大于0时,执行SGDT、SIDT、SMSW和STR指令会导致一般保护异常。
加强EL2向量映射,防止系统寄存器泄漏信息。
将/proc/kallsyms文件中函数地址值全部设置为0。
限制非管理员用户读取内核日志(syslog,通过dmesg查看)。
将未初始化的栈全部填充为0xaa,包括未初始化的变量。
通过引用在内核编译时将变量初始化(gives the kernel complete initialization coverage of all stack variables passed by reference)
加强freelist,避免常见的freelist攻击。
翻译了一遍安全模式,也看了好多文章,发现好多之前不懂的,比如miscocode、CWE等等,也算是不少收获吧,不枉花费了这两三天时间。
这篇文章拖的有点久,从去年11月份就开始搞,后面复习什么的就没继续了,虽然大体知识过了下,但是感觉没有精力去完善,就简单完结下吧。
V8引擎是一种JavaScript引擎的实现。
JavaScript引擎是执行JavaScript代码的程序或解释器。javaScript引擎可以实现为标准解释器或即时编译器,它以某种形式将JavaScript编译为字节码。
V8是被设计用来提高网页浏览器内部JavaScript执行的性能的。V8引入了JIT在运行时把js代码进行转换为机器码,而不产生字节码或任何中间代码,从而提高了性能。相应的代码执行过程大致为:源代码→抽象语法树→JIT→本地代码。
另外,在V8中当某些代码需要被执行时,才会进行编译。
V8充分多进程:主进程负责获取代码,编译生成机器码;有专门负责优化的进程;还有一个监控进程负责分析哪些代码执行比较慢,以便Crankshaft做优化;最后还有一个就是GC进程,负责内存垃圾回收。
V8具体优化方案(这里只列举,详细可查看最下方参考文章):
v8项目结构如下:
使用时需要添加启动参数--allow-natives-syntax
,可用于打印对象的内存地址、属性、map等。
即为断点,相当于int 3。
用于输出变量值。
用于输入。
gdb-v8-support.py
为v8自带的gdb调试命令,位于/tools/目录下,添加到gdbinit中即可使用。
用于可视化显示JavaScript对象的内存结构。(注意:只能在debug版本中使用,release版本会提示No symbol "_v8_internal_Print_Object" in current context.
)
用于查看指定内存地址的数据。
用于提供开发者们希望浏览器原生提供支持的功能。
首先下载源码:
1 | fetch v8 |
回退到相应版本
1 | git reset --hard 6dc88c191f5ecc5389dc26efa3ca0907faef3598 |
接着在v8目录下打上patch:
1 | git apply /path/oob.diff |
接着进行编译:
1 | gclient sync |
这样就将题目环境搭建好了。
在分析漏洞前首先要搞懂patch的文件是什么。
可以明显看到对数组添加了oob方法:
1 | BUILTIN(ArrayOob){ |
即当参数个数为1时,返回array[length]处的值的浮点数形式;当参数个数为2时,将参数2以浮点数方式向array[length]处写入。
很明显,array[length]是数组溢出,而在js中,这个位置存放的是map类型,用于对该数组进行解析。
其中:
因此修改map属性使其从整数变为浮点数等即可做到溢出,接着修改地址及长度即可做到任意写,然后结合wasm即可获取flag。具体步骤见参考文章4。
Linux kernel>2.6.22 (released in 2007)
在线代码地址:/mm/gup.c
总结来说(偷下懒,具体可以参考链接第三个,或者星盟公开课)就是获取页面时,会使用get_user_pages函数来获取。但因为存在cow机制,对不可写页通过mem文件写入时会产生一个不会实际写入文件的副本,且该副本的页表被内核释放时其读写权限不变,再次调页映射回来会是原本文件的页表,这样就造成了对不可写文件的漏洞。
函数定义:
1 |
|
这个函数是用来建议内核对addr~addr+len这部分内存进行何种操作。MADV_DONTNEED代表近期不会访问该内存,内核将释放掉这一内存以节省空间,相应页表项也会被置空。
/proc/pid/mem这个文件是程序内存的映射,同时当前用户是具有对该文件的读写权限的,因此可以通过对该文件的写入达到对不可写段进行修改的目的,
这个CVE-2021-3156算是真正意义上的第一个洞吧,亲自上手调了下,当然关于参数到底怎么变化的还没有去搞清楚,不过光是理清调试方法以及调用链就花了好久,也积累了好多经验,希望后面复现其他能熟练点吧。
sudoedit允许用户安全地编辑文件,命令格式是sudoedit file
,该命令首先创建你要编辑的文件的临时副本,然后搜索SUDO_EDITOR,VISUAL和EDITOR环境变量(按此顺序),以确定应调用哪个编辑器来打开刚刚创建的临时副本。 用户完成修改工作后,更改将复制回原始文件。
另外,sudoedit其实是sudo程序的软链接,但使用sudoedit启动会设置其mode为MODE_EDIT。
1 | Sudo version 1.8.21p2 |
在set_cmnd
函数中,当from
为\\
时,会自增,跳过NULL字符,继续复制envp参数,从而可构造堆溢出:
1 | for (to = user_args, av = NewArgv + 1; (from = *av); av++) { |
第一次尝试cve,调试过程中遇到了好多问题。
第一个是去符号了,这个通过字符串等搜索可以确定基本的main函数和parse_args函数(0x11760)。
另外在代码中找不到set_cmnd函数的入口,尝试步过确定范围,最终在0x5674处发现程序报错:
进入函数发现调用了/usr/lib/sudo/sudoers.so动态库中的函数,并通过字符串确定是sudoers_policy_check函数地址为0x171A0,sudoers_policy_main函数地址为0x1D8A0,不过set_cmnd内联在sudoers_policy_main函数里了,大概漏洞点在0x1DC68处。
另外可以通过在gdb中catch exec
再c
进入sudo程序的调试。
总的利用过程为:利用堆溢出,修改堆中service_user
结构中的动态库名,然后通过nss_load_library
函数调用该动态库,最后提权。
service_user结构如下:
1 | typedef struct service_user |
下面是nss_load_library函数的部分代码,可以看到将libc名称自动补全为"libnss_"+name+".so"
,然后载入内存。
1 | static int |
注:在Linux中通过locale来设置程序运行的不同语言环境,LC_ALL=C.UTF-8@
即去除所有本地化的设置,其中C
是系统默认的locale,UTF-8
表示字符集。
CVE-2021-3156: Heap-Based Buffer Overflow in Sudo (Baron Samedit)
]]>原文地址:传送
Linux kernel 4.8.13及之前的版本中的net/core/sock.c文件的sock_setsockopt
函数存在安全漏洞,该漏洞源于程序没有正确的处理sk_sndbuf
和sk_rcvbuf
的负值。本地攻击者可利用该漏洞造成拒绝服务(内存损坏和系统崩溃)。
Linux kernel 3.11 -> 4.8
sock_setsockopt中关于sk_sndbuf
和sk_rcvbuf
的处理:
1 |
|
max_t定义如下:
1 |
|
以set_sndbuf为例,max_t(u32, val * 2, SOCK_MIN_SNDBUF)
即以u32
类型(无符号整数)比较val * 2
和SOCK_MIN_SNDBUF
的大小,因此会出现-1>100这样的情况,从而导致被攻击。
PS:需要自行修改偏移。且条件竞争存在一定概率,需多运行几遍才可提权
1 |
|
close(sockets[0]);
时会调用skb_release_data()
。其代码如下:
1 | static void skb_release_data(struct sk_buff *skb) |
其中skb_shinfo(skb)
返回值为skb->end
+skb->head
。接着通过获取到的shinfo读取destructor_arg结构,从而调用callback指针函数。
在POC中:
setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUFFORCE,&sndbuf, sizeof(sndbuf));
将设置skb->end
为0xfffffec0,再加上skb->head
(0x10),即shinfo
=0xfffffed0。https://github.com/nuoye-blog/cve/tree/master/cve-2016-9793
可以在Linux kernel 4.8.14版本中看到max_t(u32, val * 2, SOCK_MIN_SNDBUF);
和max_t(u32, val * 2, SOCK_MIN_RCVBUF);
被修改为了max_t(int, val * 2, SOCK_MIN_SNDBUF);
以及max_t(int, val * 2, SOCK_MIN_RCVBUF);
。
CVE-2016-9793 Linux kernel 安全漏洞-漏洞情报、漏洞详情、安全漏洞、CVE - 安全客,安全资讯平台 https://www.anquanke.com/vul/id/1123808
]]>linux中运行下命令就出来flag了。
简单的vm题,stack可以越界写
首先free掉一个0x20大小的chunk,然后利用stack的越界写修改其fd到bss段上,并且将它的size改掉,避免重复进入该chunk。
接着申请到bss段上把buf置0,并将stack指针修改为got表中atoi的地址。
最后按位加减got表中atoi函数地址,改成system,再输入/bin/sh即可getshell。
1 | from pwn import * |
存在off by one漏洞,利用该漏洞进行unlink操作将堆块操作地址指向bss段上,即可任意地址读写。
同时再向bss段上存放堆块的地址存写入main_arean地址,利用上面的地址修改其低位,爆破到stdout进行ioleak。
接着向__free_hook
中写入system函数地址即可getshell。
1 | from pwn import * |
湖湘杯的原题,利用name来进行泄漏,得到libc地址。在堆上布置好one_gadget地址并free两个堆块得到堆地址。
接着用后面函数劫持栈地址从而执行onegadget。
1 | from pwn import * |
存在uaf,利用ioleak获得libc地址,然后修改__malloc_hook
即可getshell。
1 | from pwn import * |
简单的mips题目,静态地址,存在UAF漏洞,并且有RWX段,可执行shellcode。
利用UAF将shellcode写到可执行段上,然后修改got表跳过去执行即可。
1 | from pwn import * |
2.29的题目,edit大小为0的时候,会将堆块free掉,但是不会清空指针,可以UAF。
先申请到标志位将其赋值得到gift函数的执行权限,得到libc地址。
再一次用UAF漏洞申请到__free_hook
处修改其为system函数地址即可getshell。
1 | from pwn import * |
开启了seccomp保护,禁止exec系统调用。
漏洞点跟上一题一样,edit大小为0的时候,会将堆块free掉,但是不会清空指针,可以UAF。
首先用unsortbin进行leak libc地址。
接着leak出heap地址。
在堆中构造出假堆头,修改free的堆块fd指向该假堆块,利用其修改name指针地址为__free_hook
。
接着将__free_hook
修改为setcontext,并在堆上写好相应的寄存器值以及rop串即可获取flag。
1 | from pwn import * |
漏洞点在于edit的时候如果size是小于8的话循环退出的判断永远为真,因此可以进行堆溢出。
首先填满tcache,利用unsortbin进行leak操作,然后用上面的堆溢出漏洞修改一个free状态的fd到__free_hook
,修改其为onegadget地址,即可getshell。
1 | from pwn import * |
漏洞点在于password输入的时候存在off by one漏洞,会修改name地址的低位为\x00:
首先填满tcache,利用unsortbin进行leak操作,接着利用上面的漏洞即可在存放name地址之前输入,修改name地址为__free_hook
地址,再一次修改name即可劫持__free_hook
。
1 | from pwn import * |
攻防世界PWN的echo_back原题。
首先是leak,然后修改_IO_buf_base
的低字节为\x00,接着利用scanf函数覆盖_IO_buf_base
和_IO_buf_end
成main函数的返回地址的栈地址以及偏移0x18的地址(rop长度为0x18),接着不断写入换行符使_IO_read_base
与_IO_read_end
相等,然后再用scanf写入rop即可getshel。
1 | from pwn import * |
首先输入0x10个size(0x20),即可实现栈溢出。然后就是简单的rop和getshell,脚本如下:
1 | from pwn import * |
只有add功能,但是用的是realloc函数,size为0时即为free。
另外输入的时候可以off by one,修改size位可在下次申请到的时候溢出该堆块。
首先构造出unsortbin,并且利用off by one漏洞溢出修改其fd为_IO_2_1_stdout_
,然后继续改另一tcache堆块fd到这里。
注意这里可以用realloc将堆块分割避免放入原来的tcache中,利用该方法进行io_leak,得到libc地址。
接着用close(1)处的逻辑将堆块指针置0,然后再次进行realloc,劫持某一tcache的fd到__free_hook
,并修改其为system即可getshell。
getshell后需要用sh >&2
恢复回显。整个脚本的概率是1/256:
1 | from pwn import * |
show和del函数未正确检查index。
首先用show(-7)
leak出pie地址。
接着填满tcache,leak出libc地址和堆地址。
然后在堆上伪造出size为0x100的堆块,并用del函数进行free,然后劫持其fd指针修改为__free_hook
,并改为system函数地址,执行/bin/sh即可。
1 | from pwn import * |
这道是赛后才做出来的,前面是简单的用堆来进行leak操作,后面主要卡在c++的异常化处理上。
最后看了Lime师傅的脚本才知道最后输入的栈指针后需要跟上一个字符才能过。具体payload如下:
1 | from pwn import * |
JIT类型题目。
有三个函数:read(读取浮点数)、puts(输出字符)、print(输出浮点数)
大体三种类型:浮点数/字符(存放在bss上)、数组(存放在堆中,只能放浮点数)、字符串(存放在堆中,每次重新赋值时若长度不同则会free后再malloc)。
字符串可以复制,并且堆上指针不变,因此存在UAF,可以进行double free。
首先填满tcache后用unsortbin进行leak操作。
接着double free一个0x20大小的堆块,修改其fd指向一同样double free了的0x50的堆块,修改0x50大小堆块的fd指向对应偏移0x28处(对应数组中存放了数值的地方)。
接着申请一个数组,输入16进制的__free_hook-0x28
对应的浮点数。
接着申请两个数组,再进行输入,即可劫持__free_hook
,修改其为system函数地址,接着free掉一个存放/bin/sh的堆块,即可getshell。
exp:
1 | from pwn import * |
c++的题目,静态分析有点困难,所以直接gdb看堆块变化。
分析发现free后未对堆指针置0,因而存在uaf漏洞。另外edit的时候会重新申请相应大小堆块。
首先double free掉0x20的堆块,并将fd修改为下面unsortbin堆块-0x10偏移处地址,方便后面进行io leak。
接着申请0x88大小的堆块,并先申请0x48大小的堆块,double free(修复后续申请堆块问题)。
接着申请0x98,防止unsortbin被合并到topchunk。
申请回0x88的堆块,将其free填满tcache即放入unsortbin,获得libc相应偏移的地址。
接着用上面0x20的堆块修改0x88堆块的fd,将其爆破到_IO_2_1_stdout_-0x61
处,并将size修改为0x21,并修复bins结构。
接着构造payload进行ioleak,注意长度需要满足,这里用了'\xff'*7+p64(0)*12+p64(0xfbad1800)+p64(0)*3+'\x00'
。这样即可leak出libc地址。
接着double free,劫持__free_hook
为system函数地址,再用edit输入shell命令:"/bin/sh".ljust(0x1f,'\x00')+'icqb8a2d9242a67b4510eacfe4635155'
,操作中即会将该堆块free并输入token。(关于截取长度的问题,这里爆破了很久,最终确定是0x1f大小后接token就可以)。
exp:
1 | from pwn import * |
对着官方exp撸了下,发现挺简单的,是一道类似于oob的题目,push、pop后会使数组越界溢出,就可以修改map属性和elements地址及长度,这样就可以做到任意读写了。在exp中搞了下注释,直接上代码:
1 | //浮点数和整数互换 |
实现了单向的操作,buy是获取堆块,load是将堆块填入,shoot是输出堆块的信息,并进行free。
首先是leak的,直接unsortbin即可leak出libc地址。
接着由于shoot的时候没有对对链表清空,所以可以先申请9个fastbin范围的堆块,倒序load再shoot,接着再申请回7个,再将第一个载入,再进行shoot,就会将原本已经在fastbin的堆块再次free,得到double free。接着再将tcache中的7个堆块申请回来,再申请一个即可发现tcache中又存在了3个tcache,并且构成了循环,这样即可达到任意地址申请的目的。
接着第一步先申请到stdout中,进行修改write的指针到environ
附近,从而leak出栈地址。
接着第二步将地址申请到栈上,劫持返回地址,修改rsp到堆上步骤好的rop串进行orw。
1 | from pwn import * |
程序存在逻辑漏洞:
第一次输入不符合要求的size后也会作为后面写入null字节的偏移量,通过这一漏洞可以修改一个free状态的fd,再在fd对应地址处输入值即可劫持fd,从而申请到任意地址。
首先通过0x80堆块进行leak,得到libc地址。接着用上述漏洞申请到__free_hook
,再将其修改为system,即可getshell。
1 | from pwn import * |
第一次输入Warning时栈上有残留信息,以此leak出libc地址。
Warning_once会对0x67f7b0+idx处地址写入一个值(该值为输入data的长度),并且idx未检查,可以输入负数溢出。
通过劫持stderr到bss上,布置好函数表,退出时会用到stderr,用system调用shell即可。
exp:
1 | from pwn import * |
用seccomp初始化沙盒,所以堆上会残留信息,以此来leak出libc地址。
接着逐位爆破cookie。
然后利用malloc_consolidate机制,将0x40的堆块合并到topchunk中,再进行guess申请到该地址,并将0x28偏移处改为cookie,即可构成double free。
继续操作将该堆块合并进top chunk中,接着再依次进行申请堆块以及guess即可写fd,通过此操作劫持__free_hook
。
将__free_hook
修改为printf即可用格式化字符串来进行leak操作。
操作完毕后0x190的tcache中会存在两个相邻的0x40的堆块,通过guess溢出第二个堆块到第一个堆块的fd,将其修改为页对齐的地址。接着申请到该地址到idx为7处,并修改__free_hook
为mprotect。接着free(7),即会将该地址设置为可读写操作。
最后将__free_hook
为下一申请到的0x190的堆块地址,并用guess在此堆块上写入shellcode进行orw。
exp:
1 | from pwn import * |
最开始会给出栈地址,存在uaf漏洞,并且这里存在栈漏洞:
可以泄漏出canary。
利用uaf申请到栈上,即可劫持返回地址进行rop操作,leak出libc的地址即可用system进行getshell了。
1 | from pwn import * |
套了web的堆题,存在uaf漏洞。
结合unsortbin进行io_leak,接着修改__free_hook
为setcontext
,利用sys_rt_sigprocmask
系统调用劫持程序流程,从而进行orw读取flag。
1 | #1/16 |
这里下载win7 professional with sp1
版本(即cn_windows_7_professional_with_sp1_vl_build_x64_dvd_u_677816.iso
镜像)。
接着新建虚拟机即可。
选择版本2.7
下载地址:https://www.python.org/downloads/release/python-2718/
下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=8279
首先下载安装cmake
:https://cmake.org/download/
安装vcpkg
,项目地址:https://github.com/microsoft/vcpkg
PS:已经安装好了VS,没有这个环节的话不太清楚
运行命令即可安装完成:
1 | set VCPKG_DEFAULT_TRIPLET=x64-windows |
接着下载wincheck,项目地址:https://github.com/trailofbits/winchecksec
修改其中的CMakeLists.txt
,在find_package
前添加下面两句命令(之前一直找不到包,卡了好久):
1 | set(pe-parse_DIR %vcpkg/buildtrees/pe-parse/x64-windows-rel/pe-parser-library) |
其中%vcpkg
为vcpkg
的地址。
然后跟着命令走:
1 | > vcpkg install pe-parse uthenticode |
这样基本就完成winpwn的环境搭建。
]]>这是不当人的一场比赛。。恰逢考试,还要一个人兼pwn和web,难受。。。。还好web不算太难,pwn的解题率就不尽人意了。。
http://183.129.189.60:10035/index.php,提示eval cmd,直接用蚁剑连接,密码cmd。在网站目录下找到bbbbbbbbb.txt文件,用base64解码得到包含flag的图片。
在Hei_Mao_Jing_Chang.mp3中找到php的代码:
1 | if(empty($_POST['Black-Cat-Sheriff']) || empty($_POST['One-ear'])){ |
通过将White-cat-monitor设置为数组类型,使hash_hmac函数报错返回0,从而得到key,接着利用key进行sha256加密并且任意命令执行,在网站目录下flag.php中包含有flag。
POST数据:
php代码如下:
1 |
|
直接向index.php写入一句话木马即可,GET数据:
1 | filename=index.php&content=%3C?php%20@eval($_POST[%27attack%27])%20?%3E |
简单的UAF漏洞。首先通过unsortbin来leak出libc地址,接着利用double free来申请到__malloc_hook
处改为onegadget即可getshell了。
1 | from pwn import * |
只能进行add和free操作,并且有个可以输出栈上信息的函数,通过解密即可得到libc和stack的地址。存在double free漏洞,并且由于禁用了execute的系统调用,所以申请回栈上,通过rop来进行ORW操作。
1 | def dec(res): |
存在double free漏洞。首先填满tcache,并leak出libc地址。接着修改堆上指向name堆块的地址为environ变量,从而leak出stack地址。接着通过tcache的double free任意申请地址到栈上,从而用rop来进行ORW操作获取flag。
1 | from pwn import * |
比较恶心的概率题。首先通过malloc_consolidate()
将fastbin中的堆块放入smallbin中,从而得到libc的地址。申请回来,修改低位,爆破到stdout结构附近。接着利用double free,并修改低位地址,爆破到上述存储有stdout结构地址处的堆块,从而申请到stdout处进行IO_leak。接着就是double free申请到__malloc_hook
然后用one_gadgets
来getshell。PS:1/256概率,日常脸黑,打了半个多小时才出来。
1 | from pwn import * |
linux下做题时经常发现目录下会多一个core文件,一直不知道是干啥,直到前几天窥屏。。。才发现是程序当前内存的映射,可以结合gdb来查看。
在命令行中输入ulimit
命令来实现:
1 | ulimit -c #返回值为0时,不会生成core dump文件 |
以上命令只对当前终端有效。
永久生效的则需更改文件/etc/security/limits.conf
。
默认core文件保存在可执行文件所在的目录下,文件名为core。
通过修改/proc/sys/kernel/core_uses_pid
文件可以让生成core文件名加上pid号。(1表示添加,2表示不添加)
还可通过修改/proc/sys/kernel/core_pattern
来控制生成的core文件保存位置及文件名格式。如echo "/tmp/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern
设置生成的core文件保存在/tmp/corefile目录下,文件名格式为core-命令名-pid-时间戳
。
利用命令gdb program core
即可调试core文件。
提前写好pwn环境搭建留给学弟学妹?
首先上ubuntu官网下载iso文件,接着用vm新建即可。(省略)
首先是换源,参考地址
在terminal中输入:
1 | sudo cp /etc/apt/sources.list /etc/apt/sources.list.bck |
然后在弹出的文本中内容替换为如下:
1 | deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse |
然后保存即可。
然后再在terminal中输入:
1 | sudo apt update |
这样即可完成换源并更新。
ubuntu20已经安装好了python3,不过习惯直接输入python打开,所以输入如下命令即可:
1 | sudo apt install python-is-python3 |
这样就可以直接输入python来运行python3了。
接着输入如下命令安装pip:
1 | sudo apt install python3-pip |
换源(参考地址):
直接在terminal中输入如下命令即可
1 | sudo pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple |
直接运行:
1 | sudo pip3 install pwntools |
PS:现在感觉都好容易,当年的,都是泪啊。
在terminal中输入如下命令:
1 | git clone https://github.com/pwndbg/pwndbg |
即可完成安装。
运行setup.sh前,需修改以下内容:
1.将setup.sh中的第24行的sudo apt-get -y install python-pip || true
,修改为#sudo apt-get -y install python-pip || true
。
2.修改requirements.txt为如下内容:
1 | future |
至此pwn的基础环境便安装完成了。
]]>