安全矩阵

 找回密码
 立即注册
搜索
查看: 1068|回复: 0

不常见的内存与流量取证 -- WMCTF 2022 1!5!

[复制链接]

260

主题

275

帖子

1065

积分

金牌会员

Rank: 6Rank: 6

积分
1065
发表于 2022-9-16 13:51:41 | 显示全部楼层 |阅读模式
本帖最后由 luozhenni 于 2022-9-16 13:51 编辑


不常见的内存与流量取证 -- WMCTF 2022 1!5!
原文链接:不常见的内存与流量取证 -- WMCTF 2022 1!5!
e*h 衡阳信安 2022-09-16 06:00 发表于山东

start
刚刚拿到这道题的时候发现这道题目的内存镜像非常特殊,Misc 取证常用的软件诸如 取证大师 和 vol 都搞不定这种内存镜像。(当然因为我电脑不存在 python2 环境,所以导致我手上的 vol 实际是 vol3, 这还是蛮多区别的,所以我一开始以为我的 vol 锅了。后来问了问同队的师傅, 确实是 vol 和 取证都爆炸了 找不到 Profile 也不能确定类型)
所以面对如此棘手的一个问题,我想起了万年前看到一个神器,尸解 (Autopsy)。
当时我的师傅找了官方的 training 课程的优惠券 (其实就是因为疫情打折直接白送) 不过这是题外话了
官网为 https://www.autopsy.com 先进行一个装
windows 的版本更加阳间一点 但是我这边用的是 web 界面版本的
macOS 直接 brew install autopsy 就行
直接运行 autopsy 然后根据命令行输出打开 https://localhost:9999/autopsy
当然不出意外,就算是 “尸解” 确实也识别不出来镜像类型,如果可以识别和处理镜像类型, autopsy 将会变成一个更为强大的工具,某种意义上是真正的取证大师。(没有碰瓷的意思)
因此最后只能使用最基础的关键词搜索功能,当然这都是后话了。
题目附件快捷方式: https://github.com/wm-team/WMCTF2022

思路达到取证最高峰 - 流量
内存不是下来就能直接打开的 所以我们先 wireshark 看看流量了,可以看到前面是一堆 quic 流量,看起来是加了密的,可以留意一下。接着是明显的 HTTP 流量 GET 了一个 flag 同时升级协议到了 websocket。
接下来 都是客户机发往服务端的 WebSocket 流量,ws 第一个包里内容是 flag,然后接下来的包似乎不是明文,可以猜测是某种特殊的加密或者编码的内容,没那么简单。不过可以先保存一下。
把过滤条件设置为 websocket 进行分组导出 可以直接导出成 json 格式
因为我更加熟悉命令行操作所以进行如下的剪切
此外 命令 jq 是一款 json jq 解析器
  1. cat tc.json|jq '.[]._source.layers."data-text-lines"' | awk "NR % 3 == 2"|cut -d """ -f 2

  2. # 这时候得到的就是下面这样的密文
  3. flag
  4. SlAZT80ZTIXZTIcZSl9ZSlTZT80ZTIXZTIwC
  5. Sx0ZTf1ZTIuZSx0ZSluZSthZTf1ZTIuZSxnC
  6. SthZStQZSt1ZT81ZT8HZSlXZStQZSt1ZT8/C
  7. Sl0ZSlQZSx6ZT8HZS46ZSlTZSlQZSx6ZT8gC
  8. SxuZT86ZTIcZTfQZTfQZTfQZT86ZTIcZTfPC
  9. TI0ZT81ZSx6ZT8HZSxcZSlhZT81ZSx6ZT8gC
  10. SxXZTIXZTIhZSl0ZSxLZT80ZTIXZTIhZSlnC
  11. SxHZT8HZSxkZSt1ZT8QZSt1ZT8HZSxkZSt/C
  12. SxXZTIBZSl0ZSlBZSlQZT8XZTIBZSl0ZSlzC
  13. StHZStQZSluZTIuZSl9ZSxkZStQZSluZTINC
  14. SlXZSlkZSxrZS40ZSthZTIBZSlkZSxrZS4nC
  15. TIuZT8QZS40ZT81ZTIXZTIXZT8QZS40ZT8/C
  16. Sl6ZSx6ZSl9ZSthZT8QZTI9ZSx6ZSl9ZStGC
  17. SxTZTIBZTIXZTf1ZT8XZSlkZTIBZTIXZTf/C
  18. SlkZSlBZS4LZS46ZTI9ZSlQZSlBZS4LZS45C
  19. T8AZSlAZSlhZSxhZSlTZS40ZSlAZSlhZSxGC
  20. TIcZSxrZSlAZSl9ZSlhZSxhZSxrZSlAZSl3C
  21. StHZStTZT8XZTI6ZSxkZS46ZStTZT8XZTI5C
  22. SxTZT8QZT8XZS46ZSlhZSlQZT8QZT8XZS45C
  23. TIcZSxrZS4LZStQZSlBZS4XZSxrZS4LZStPC
  24. StHZSx6ZSluZT8TZSlQZSx0ZSx6ZSluZT8SC
  25. SxuZTIXZSxcZTf1ZSluZSxkZTIXZSxcZTf/C
  26. StAZSx6ZSl0ZSluZSl9ZT86ZSx6ZSl0ZSlNC
  27. T81ZS40ZS4XZTIcZSt1ZTIBZS40ZS4XZTIwC
  28. T8LZTIcZSxcZT86ZSxrZSl6ZTIcZSxcZT85C
  29. StHZS4XZSlkZSluZT8HZS46ZS4XZSlkZSlNC
  30. StQZTIuZSxhZSlAZSxcZSxBZTIuZSxhZSlbC
  31. SlLZSt1ZSthZS4XZSl6ZTI9ZSt1ZSthZS4WC
  32. Sl0ZT8TZStQZTfQZSxrZT86ZT8TZStQZTfPC
复制代码
流量里基本就只有这些信息了

还是看看远处的内存吧 家人们
autopsy
跟着网上教程 直接创建案件 case
然后编写受害者信息 host
然后以链接方式导入 内存镜像
这样一个初始化的分析就完成了
内存 fake flag
既然他说内存里存在假 flag 那么我们大可搜索 WMCTF{ 这类字符串, 假 FLAG 多半是在测试的时候留下的内容,因此可以想到这类内容边上可能就是我们可以找的代码段,确实 我们可以在多处找到这个字符串,可以发现在 flag 出现的同时伴随着不少 Go 源码。我们可以找到相关的服务端收信逻辑。
如下
  1. package main

  2. import (
  3.     "github.com/gin-gonic/gin"
  4.     "github.com/gorila/websocket"
  5.     "net/http"
  6. )

  7. var f1ags = "WMCTF{WebSOcket_And"
  8. var upGrader = websocket.Upgrader{
  9.     CheckOrigin: func(r *http.Request) bool {
  10.         return true
  11.     },
  12. }
  13. //...flag
  14. func flag (c *gin. Context) {
  15.     //......get.........webSocket......
  16.     ws,err := upGrader.Upgrade(c.Writer, c.Request, nil)
  17.     if err != nil {
  18.         return
  19.     }
  20.     defer ws.Close ()
  21.     //.........flags.........
  22.     for {
  23.         //......ws.......
  24.         mt, message, err := ws.ReadMessage()
  25.         if err ! = nil {
  26.             break
  27.         }
  28.         if string (message) == "flag" {
  29.             //.....flags
  30.             for i:= 0; i< len (flags) ; i++ {
  31.                 ch := string(flags[i])
  32.                 err : = ws. WriteMessage (mt, []byte (ch))
  33.             //sleep......
  34.             //time. Sleep (time. Second)
  35.             if err != nil {
  36.                 break
  37.             }
  38.         }
  39.     }
  40. }
  41. func main() {
  42.     bindAddress := "localhost:2303"
  43.     r := gin. Default ()
  44.     r.GET("/flag", flag)
  45.     r.Run(bindAddress)
  46. }
复制代码
不过只有一半的 FLAG 而且程序逻辑似乎和我们需要的逻辑并不相符。(这里看起来是服务端,而且没有我们需要的加密解密算法) 不过就这些地方已经可以看到一些端倪了
探寻 websocket 和 key
接下来有两条思路
  • 搜索 websocket 关键字尝试寻找那段 web 通讯中的具体信息 肯定可以找到对应代码
  • 搜索 key 关键字 尝试破解 QUIC 流量拿到其他的 key
在 autopsy 的 数据分析中的关键词搜索可以顺带获取对应字符串在镜像中的位置
联合使用关键字搜索(Keyword Search) 和基于 Offset (Data Unit)的搜索
你先会发现可能被破坏的内存区块,但是没关系,肯定有完整的。
有些会有 RgU.... 这种坏字符
接下来我们会大量看到 (除了上面 go 部分的代码) 诸如下面代码块的内容
another go
关键字 key
  1. "fmt"
  2. "github.com/lucas-clemente/quic-go/http3"
  3. "log"
  4. "net/http"
  5. "os"
  6. )

  7. func HelloHTTP3Server(w http.ResponseWriter, req *http.Request) {
  8. fmt.Printf("client from : %s\n", req.RemoteAddr)
  9. fmt.Fprintf(w, "_HTTP3_1s_C000L}\n")
  10. }

  11. func main() {

  12. mux := http.NewServeMux()
  13. mux.Handle("/", http.HandlerFunc(HelloHTTP3Server))

  14. w := os.Stdout

  15. server := http3.Server{
  16.   Addr: "127.0.0.1:18443",
  17.   TLSConfig: &tls.Config{
  18.    MinVersion:   tls.VersionTLS13,
  19.    MaxVersion:   tls.VersionTLS13,
  20.    KeyLogWriter: w,
  21.   },
  22.   Handler: mux,
  23. }

  24. err := server.ListenAndServeTLS("./my-tls.pem", "./my-tls-key.pem")
  25. if err != nil {
  26.   log.Fatal(err)
  27. }
  28. }
  29. ..........................L...............L...i............................my-tls.pem......-----BEGIN CERTIFICATE-----
  30. MIIDazCCAlOgAwIBAgIUAuwgrK8T+kosTHW9KW11AvscB88wDQYJKoZIhvcNAQEL
  31. BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
  32. GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMjA3MTkwODUyNTFaFw0yNTA3
  33. MTgwODUyNTFaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
  34. HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
  35. AQUAA4IBDwAwggEKAoIBAQD62iNNKuGH54IDYqbg00gD/gbO9wq+UwmiYBXzYqnn
  36. K9lTWvOEqlNvYNLhAoALcRrCkpqhw3ks/dhKqPCbDI3bxbQT3vZrvaRkP/DO1SnX
  37. jmCt5yExDYXhPxNF+lWHs8TP7SjDE6sC6h+lEhYaQsKd/wYhw54NW/USrUR685r5
  38. M1MfVg0+VOu5fqhwbOkn9lmwJaEOAtTIBAyG1jPFlt5LsBshe+2CXEG1cbaCDInB
  39. 6Jz6IZ7zN9KQ0YrWY8y2iw0toVODuNZnU7pSeKdWRwX6eYU3NA+QaTYl2zpl939b
  40. jVtNKWlY+DiUFroTucph9W4jWvzu9Yp9uGEO46VvCV+tAgMBAAGjUzBRMB0GA1Ud
  41. DgQWBBSzrkF13VZfMqO3s/1K1gogeETXdTAfBgNVHSMEGDAWgBSzrkF13VZfMqO3
  42. s/1K1gogeETXdTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQD0
  43. /EZXhjszp2KHnekh8Ktz66pIkxRa9ErZCbQt/7os4jCdj77OhcFYQ4O/mhdOeQb4
  44. zvKlb0sAxsLcJiK1WB9cIcG+j4Kmrp6vJ8nRlI2YMBi8dX/MNDgBgXw/DdeuISyU
  45. K05t26oQJxYfZ36zT2k2NVUdnvqAXTbk4IGxnfGRJJXZ/70iBWJYXEaB8UKeTXrn
  46. VSefJKbO9v0CmuxWQxP363nB/e5f+l73ELTO3bs7qqyz9FHqZuR8cCo5YJ05c8G+
  47. CLuL4JtyOX+7Cd+pGtadc54XtNYWw35CbBkHzhKwtU/+c24eM+SXV1AakzrSHHE3
  48. 1p80nnkmmO4f9yG5CZ8/
  49. -----END CERTIFICATE-----
  50. ..........................L...............L.@..............................my-tls-key.pem......-----BEGIN RSA PRIVATE KEY-----
  51. MIIEpAIBAAKCAQEA+tojTSrhh+eCA2Km4NNIA/4GzvcKvlMJomAV82Kp5yvZU1rz
  52. hKpTb2DS4QKAC3EawpKaocN5LP3YSqjwmwyN28W0E972a72kZD/wztUp145grech
  53. MQ2F4T8TRfpVh7PEz+0owxOrAuofpRIWGkLCnf8GIcOeDVv1Eq1EevOa+TNTH1YN
  54. PlTruX6ocGzpJ/ZZsCWhDgLUyAQMhtYzxZbeS7AbIXvtglxBtXG2ggyJweic+iGe
  55. 8zfSkNGK1mPMtosNLaFTg7jWZ1O6UninVkcF+nmFNzQPkGk2Jds6Zfd/W41bTSlp
  56. WPg4lBa6E7nKYfVuI1r87vWKfbhhDuOlbwlfrQIDAQABAoIBAQD16xPgesFOcm7K
  57. 0tO2ZGqdP1N9YkJuAwnW3UunpnnZ3urXBLrmu/O/pLQXUlQk42TQith87RzGNrTr
  58. vGLkHZKUeWTodhQt22RlwylYGzFB2Jp+4a9wX0l4YFWMrLVcq6euD1l+pLFp0gvj
  59. z69LX1dbfL+OKi+v+Q5wmNwhjN/Im89qAxTHAKUlGQGy7cZq0aewVkF7qPrV44tA
  60. 4uUk2h36k+MFELUeDBAhegH6todAnjI+Ec72OzhtDDEF5hHM+1e3fsngz2RdfMQM
  61. gnHm5fdb4yVGOV5K1HqVpDqKyCLIr0JvKNf/5HktJ/+lSlliL/mrx3KQCRt1DWN9
  62. O8EBaMgBAoGBAP7GYPtzwXwn5bDmkD+//ejZm5SDq1EZ6ZSIttHl2OfbFwU45X0N
  63. cMyuBXcHkiaVuD2GXiKmy5W4xh3WRPF4o7qMLe4dcUbTqqwc6nnY+2fLY71TMM9a
  64. MjRQuQHnwQsMrCVYiv0/50eKwglc61ogsv+WmFxfYZtjnGMJP6M6xtlBAoGBAPwO
  65. 7iAQTNAZhrTefwDXSGirc1BVg0FBB05woVm/Gn0hkZqrl9VJd6g7gCAHh4tndR54
  66. j5IR67eROoPY+tZSF8Gc/ne66BH2yq3Xbh3E281ajft+RLUFuD6k+Rlq2l91J72x
  67. H46mKl/toB9ukPxl0P/8vOViXMYVlFsPHGnAEB9tAoGBAJ/Op36SOUc7b2Pq+4hB
  68. UW8BMAmUHZ2dd1pn9uTqG4gzcNkhuzEZgSuh7GOhKBdzykEtS1bI8OJVKFAG2u/s
  69. ECcvTpARf8BBfMjAyoLri6areUCEMhWeKeeOyr1bNUdNB53VUDlSICxL6TIeSrIZ
  70. 2K1hNOicG4lwjePBJV2pvJkBAoGAVERRi9qnM3M1O8aewxM2G/glxxevl+M7pBe3
  71. eZ+QJYFRgloXmrDDFjU+MncR86MU3qkDppvjKC2fWHDz+y7azlnEIRcVetv9Cn1Z
  72. TQ6BRXgeu5ONOM++twLEXKECfKNYM+zBVhlrVULGI3v9cMRBSTOfmzh1N6wDOyYk
  73. I56YRUkCgYBhPvpgPohOzEukToo64UtbmOK25pKJBHfhMH/jGglfFUnzAURXPC4b
  74. 7HIxMSGd5A0EjX34M7CA4rRHXcF7Sxc6X4eP43FoZabey6di+rIvm6F/pQFRTT/u
  75. uSNIJWzf9lF5rbqKMxPlHVJLvlnIVZNSjUV2FIdCe4LR55qzByOOvQ==
  76. -----END RSA PRIVATE KEY-----
复制代码
这里有 key 也能看到似乎是后半个 flag 的变量
JS
  1. var ws = new WebSocket("ws://localhost:2303/flag");  

  2. ws.onopen = function(evt) {  
  3.     console.log("Connection open ...");  
  4.     ws.send("flag");  
  5. };  

  6. ws.onmessage = function(evt) {  
  7.     var rstr = randomString(5)  
  8.     n = evt.data  
  9.     res = n.padEnd(9,rstr)  
  10.     s1= encrypto(res,15,25)  
  11.     f1 = b1.encode(s1)  
  12.     ws.send(f1)  
  13.     console.log('Connection Send:'+f1)  
  14. };  

  15. ws.onclose = function(evt) {  
  16.     console.log("Connection closed.");  
  17. };  


  18. function Encode() {  

  19.   _keyStr = "/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC";
复制代码
这里基本已经可以看到 加密的逻辑了 基本可以猜测我们需要的内容就在这里
找到完整的代码可以试试用关键字 _keyStr
接下来摸到相关的内存 Unit 号之后 在该数字后面稍微减少 10 左右
然后使用 Data Unit 分析附近内存号 ± 20 个内存单元的内容
接着我们可以摸到如下的代码 大约在 内存编号 987382 处
  1. <script>  

  2. function randomString(e) {  
  3.     e = e || 32  
  4.     var t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",  
  5.     a = t.length,  
  6.     n = "";  
  7.     for (i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a));  
  8.     return n  
  9. }  


  10. function encrypto( str, xor, hex ) {  
  11.   if ( typeof str !== 'string' || typeof xor !== 'number' || typeof hex !== 'number') {  
  12.     return;  
  13.   }  

  14.   let resultList = [];  
  15.   hex = hex <= 25 ? hex : hex % 25;  

  16.   for ( let i=0; i<str.length; i++ ) {  
  17.     let charCode = str.charCodeAt(i);  
  18.     charCode = (charCode * 1) ^ xor;  
  19.     charCode = charCode.toString(hex);  
  20.     resultList.push(charCode);  
  21.   }  

  22.   let splitStr = String.fromCharCode(hex + 97);  
  23.   let resultStr = resultList.join( splitStr );  
  24.   return resultStr;  
  25. }  

  26. var b1 = new Encode()  

  27. var ws = new WebSocket("ws://localhost:2303/flag");  

  28. ws.onopen = function(evt) {  
  29.     console.log("Connection open ...");  
  30.     ws.send("flag");  
  31. };  

  32. ws.onmessage = function(evt) {  
  33.     var rstr = randomString(5)  
  34.     n = evt.data  
  35.     res = n.padEnd(9,rstr)  
  36.     s1= encrypto(res,15,25)  
  37.     f1 = b1.encode(s1)  
  38.     ws.send(f1)  
  39.     console.log('Connection Send:'+f1)  
  40. };  

  41. ws.onclose = function(evt) {  
  42.     console.log("Connection closed.");  
  43. };  


  44. function Encode() {  

  45.   _keyStr = "/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC";  

  46.   this.encode = function (input) {  
  47.     var output = "";  
  48.     var chr1, chr2, chr3, enc1, enc2, enc3, enc4;  
  49.     var i = 0;  
  50.     input = _utf8_encode(input);  
  51.     while (i < input.length) {  
  52.       chr1 = input.charCodeAt(i++);  
  53.       chr2 = input.charCodeAt(i++);  
  54.       chr3 = input.charCodeAt(i++);  
  55.       enc1 = chr1 >> 2;  
  56.       enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);  
  57.       enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);  
  58.       enc4 = chr3 & 63;  
  59.       if (isNaN(chr2)) {  
  60.         enc3 = enc4 = 64;  
  61.       } else if (isNaN(chr3)) {  
  62.         enc4 = 64;  
  63.       }  
  64.       output = output +  
  65.       _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +  
  66.       _keyStr.charAt(enc3) + _keyStr.charAt(enc4);  
  67.     }  
  68.     return output;  
  69.   }  


  70.   _utf8_encode = function (string) {  
  71.     string = string.replace(/\r\n/g,"\n");  
  72.     var utftext = "";  
  73.     for (var n = 0; n < string.length; n++) {  
  74.       var c = string.charCodeAt(n);  
  75.       if (c < 128) {  
  76.         utftext += String.fromCharCode(c);  
  77.       } else if((c > 127) && (c < 2048)) {  
  78.         utftext += String.fromCharCode((c >> 6) | 192);  
  79.         utftext += String.fromCharCode((c & 63) | 128);  
  80.       } else {  
  81.         utftext += String.fromCharCode((c >> 12) | 224);  
  82.         utftext += String.fromCharCode(((c >> 6) & 63) | 128);  
  83.         utftext += String.fromCharCode((c & 63) | 128);  
  84.       }  

  85.     }  
  86.     return utftext;  
  87.   }  

  88. }  
  89. </script>
复制代码

逆向算法

这里我写了一个小小的 Decode 就交给队里的逆向大师傅了
我的 Decode
  1. // encrypto rev
  2. function decrypto(str ,xor ,hex) {
  3.     console.log("decrypto_get:","str: " + str, xor,hex)
  4.     let splitStr = String.fromCharCode(hex + 97);
  5.     resultStr = str.split(splitStr);
  6.     console.log(resultStr)
  7.     resultList = []
  8.     for(let i = 0; i<resultStr.length; i++) {
  9.         charCode = resultStr[i];
  10.         char = parseInt(charCode,hex);
  11.         char2 = (char ^ xor);
  12.         str = String.fromCharCode(char2);
  13.         resultList.push(str);
  14.     }
  15.     text = resultList.join("")
  16.     console.log("decrypto_return: " + text)
  17.     return text
  18. }
复制代码
大师傅给出来的结果
  1. this.decode = function(input) {
  2.         // input = String(input)
  3.         //  .replace(REGEX_SPACE_CHARACTERS, '');
  4.         var length = input.length;
  5.         if (length % 4 == 0) {
  6.             input = input.replace(/==?$/, '');
  7.             length = input.length;
  8.         }
  9.         if (
  10.             length % 4 == 1 ||
  11.             // http://whatwg.org/C#alphanumeric-ascii-characters
  12.             /[^+a-zA-Z0-9/]/.test(input)
  13.         ) {
  14.             error(
  15.                 'Invalid character: the string to be decoded is not correctly encoded.'
  16.             );
  17.         }
  18.         var bitCounter = 0;
  19.         var bitStorage;
  20.         var buffer;
  21.         var output = '';
  22.         var position = -1;
  23.         while (++position < length) {
  24.             buffer = _keyStr.indexOf(input.charAt(position));
  25.             bitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer;
  26.             // Unless this is the first of a group of 4 characters…
  27.             if (bitCounter++ % 4) {
  28.                 // …convert the first 8 bits to a single ASCII character.
  29.                 output += String.fromCharCode(
  30.                     0xFF & bitStorage >> (-2 * bitCounter & 6)
  31.                 );
  32.             }
  33.         }
  34.         return output;
  35.     };
复制代码
合作非常愉快
队里的 RE 大师傅用了一会儿就搞定了,搞定之后直接顺手就解出结果了。
什么叫术业有专攻啊 战术后仰 (x
结果
  1. WdzsPXdzs
  2. MrtMmCrtM
  3. CBDkfSBDk
  4. TYKf4XYKf
  5. Fbspppbsp
  6. {kKfEZkKf
  7. LzaTNdzaT
  8. OfGDiDfGD
  9. LxTQYcxTQ
  10. _BmtPGBmt
  11. SnH6CxnH6
  12. ti6kzzi6k
  13. RKPCiwKPC
  14. 1xzrcnxzr
  15. nQ74wYQ74
  16. gWZ3X6WZ3
  17. sHWPZ3HWP
  18. _AcyG4Acy
  19. 1ic4ZYic4
  20. sH7BQ5H7B
  21. _KmhYMKmh
  22. FzErmGzEr
  23. @KTmPbKTm
  24. k65sDx65s
  25. esEbHRsEb
  26. _5nmf45nm
  27. Bt3WEJt3W
  28. UDC5RwDC5
  29. ThBpHbhBp

  30. ==> WMCTF{LOL_StR1ngs_1s_F@ke_BUT
复制代码

BUT 后面明显还有后半句话 猜想是 一半 flag 的藏头
想到之前还存在后半段 Flag 在内存中 进行一个拼接后提交
  1. WMCTF{LOL_StR1ngs_1s_F@ke_BUT_HTTP3_1s_C000L}
复制代码

虽然说有一点点脑洞但是基本题目逻辑是清晰的。可以说是出的很好的一道 misc。
misc 不是套娃捏 misc == 套娃 的坏毛病建议改改

说说 Autopsy 工具

赛后在和队友和其他队伍的成员交流的时候, 发现大家都基本在使用 VOL 取证大师 strings或者一些二进制编辑器,甚至听说有用 WinHex 嗯做来解这道题的。相反对于一些国外的优秀工具了解并不是很多,于是我一合计就有了这篇文章。
在 Autopsy 的帮助下,我基本不需要担心搜素字符串不全或者很慢的问题,这些内容都交给工具自动处理了。Autopsy 不仅非常的贴心的在关键字的搜索中有专门的正则搜索,而且还会额外帮你匹配大小写不敏感的搜索,也可以匹配到诸如 S\x00T\x00R\x00I\x00N\x00G\x00 的字符串。所以我的脑袋基本聚集于根据获取的结果进一步推理相关内容去解题的过程中。

此外 Windows 版本使用流程和 web 版本的基本一致,如果你是使用该版本来解决这道题,你可以直接提取出来镜像里所有的文件。关键字搜索也很方便,他可以直接识别出来 go 文件。但是定位代码相关上下文就非常的困难,就是 data unit 相关的功能有一点点欠缺,不过问题不大。
来源:先知(https://xz.aliyun.com/t/11699)

注:如有侵权请联系删除


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 13:52 , Processed in 0.013377 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表