1 HelloWorld

就个人来说,所学的c,第一个成功运行的程序既是HelloWorld了:

1
2
3
4
5
6
#include <stdio.h>
int main()
{
printf("Hello, World!");
return 0;
}

当时觉得很简单、很理所当然。然而,如此简单的程序之下,调用的printf,却是一个非常难理解的”变参函数”。

普通的参数遵守调用规则,从右到左参数依次压栈。而变参函数呢?堆栈又由谁恢复呢?

2 变参函数导致的问题

printf来说,该函数的函数原型是

1
int printf(const char *format,...);

简单来说,该变参函数,使用format所指向的字符串来解析后面不定长(以...表示)的参数。

那么,若format中所声明的参数,多于实际传入的变量又该如何呢?这就导致了所谓的fmt漏洞:printf函数会输出堆栈上传入参数之后的数据。

对于%s来说,会输出传入值所指向的字符串;对于%p来说,会输出传入的值。当然,也可以使用%c/%x/%d等方式输出堆栈上的数据。

3 任意位置

3.1 使用$说明参数编号

此处参数编号从format之后开始,从1数起。

1
2
3
4
5
6
int main()
{
printf("%3$s, %2$s!\n","x","World","Hello");
return 0;
}
//Hello, World!!

看wiki上说不是c99标准,但是感觉遇到的都实现了这玩意吧。

3.2 使用传入的参数作为地址

因为传入的参数也是在堆栈上,所以很随意就可以用$来指出来,再搭配$s一波美滋滋。

4 写数据

甚至你还可以用printf来写内存, 参数%i会统计当前已输出的字符个数,并赋值到传入值所指向的位置。

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main()
{
int x=0;
printf("Hello%n, World!\n",&x);
printf("%d",x);
return 0;
}
//Hello, World!
//5#

5 其他

突然、就水了一波。
最近在看CS的那些玩意,cna真乃神器。现在就差个beacon的源码搞一搞了,虽然看片子、看代码好像没有像那些exe能直接插的地方,但是说不定那些正版大佬的Arsenal就会附赠一份beacon源码呢。所以还是只能用那屎一样的ruby写的msf了么……

简单来说,就是被丢了道vm的题,说没writeup。搜了搜确实没有,于是摸了摸,发现适合入门。

查看调用栈

程序读取输入时,查看调用

1
2
3
4
5
6
7
8
(gdb) bt
#0 0x00000000004402b0 in ?? ()
#1 0x0000000000400ae1 in ?? ()
#2 0x00000000004010ba in ?? ()
#3 0x0000000000400659 in ?? ()
#4 0x0000000000401e26 in ?? ()
#5 0x000000000040201a in ?? ()
#6 0x0000000000400969 in ?? ()

分析流程

拖入ida

Read more »

idea测试不乱码,mvn clean package打包后运行乱码。是因为java的默认编码不是UTF8。
直接运行java -Dfile.encoding=utf-8 -jar springboot_demo.jar;或者设置变量JAVA_TOOL_OPTIONS-Dfile.encoding=utf-8后直接运行即可。

解决msys2提示替换 mingw-w64-i686-ncurses 为 mingw32/mingw-w64-i686-pdcurses 吗 ?后失败的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
➜  ~ pacman -Syyu
:: Synchronizing package databases...
mingw32 545.2 KiB 822K/s 00:01 [------------------------------------------------------------------------] 100%
mingw32.sig 119.0 B 5.81K/s 00:00 [------------------------------------------------------------------------] 100%
mingw64 546.4 KiB 3.38M/s 00:00 [------------------------------------------------------------------------] 100%
mingw64.sig 119.0 B 9.68K/s 00:00 [------------------------------------------------------------------------] 100%
msys 180.4 KiB 5.68M/s 00:00 [------------------------------------------------------------------------] 100%
msys.sig 119.0 B 11.6K/s 00:00 [------------------------------------------------------------------------] 100%
:: Starting core system upgrade...
there is nothing to do
:: Starting full system upgrade...
warning: mingw-w64-i686-binutils: local (2.31.1-1) is newer than mingw32 (2.30-6)
:: Replace mingw-w64-i686-ncurses with mingw32/mingw-w64-i686-pdcurses? [Y/n] y
:: Replace mingw-w64-i686-termcap with mingw32/mingw-w64-i686-pdcurses? [Y/n] y
warning: mingw-w64-x86_64-binutils: local (2.31.1-1) is newer than mingw64 (2.30-6)
:: Replace mingw-w64-x86_64-ncurses with mingw64/mingw-w64-x86_64-pdcurses? [Y/n] y
:: Replace mingw-w64-x86_64-termcap with mingw64/mingw-w64-x86_64-pdcurses? [Y/n] y
resolving dependencies...
looking for conflicting packages...
error: failed to prepare transaction (could not satisfy dependencies)
:: installing mingw-w64-i686-gcc (9.1.0-2) breaks dependency 'mingw-w64-i686-gcc=7.4.0-1' required by mingw-w64-i686-gcc-ada
:: installing mingw-w64-i686-gcc (9.1.0-2) breaks dependency 'mingw-w64-i686-gcc=7.4.0-1' required by mingw-w64-i686-gcc-objc
:: installing mingw-w64-x86_64-gcc (9.1.0-2) breaks dependency 'mingw-w64-x86_64-gcc=8.3.0-2' required by mingw-w64-x86_64-gcc-ada
:: installing mingw-w64-x86_64-gcc (9.1.0-2) breaks dependency 'mingw-w64-x86_64-gcc=8.3.0-2' required by mingw-w64-x86_64-gcc-objc

查找资料,发现已将*-ncurses*-termcap替换为*-pdcurses,但这不是导致错误的原因.导致错误的原因是adaobjc已经被弃用,需要手动移除adaobjc.
pacman -R --noconfirm mingw-w64-i686-gcc-ada mingw-w64-i686-gcc-objc mingw-w64-x86_64-gcc-ada mingw-w64-x86_64-gcc-objc,然后pacman -Syyu问题解决

PE结构

也是一些基础啦

文件头

一开始DOS头的最后一个成员指向NT头.
NT头的中定义了加载地址,加载选项,入口地址.也在最后一个成员IMAGE_DATA_DIRECTORY_ARRAY定义了pe文件包含导入表、导出表、资源表、重定位表在内的、固定的15个表信息,包含RVA与大小信息.
NT头后的IMAGE_SECTION_HEADER定义了所有的区块(如.upx0、.upx1、.text等)的加载信息,包含RVA、名称、大小等信息。

导入表

先来看一波结构体,其中前置的有:dos头->nt头->附加头->导入表--(对应区段地址)-->PIMAGE_IMPORT_DESCRIPTOR

Read more »

Q:

1
2
3
req=requests.post("http://www.example.com/post_it",data=_data,headers=_headers)
req.content
#{"status":"error","code":"不能以get的方式请求"}

A:

求求你吧网址最后的**/**加上,网址写全了.

1
2
3
req=requests.post("http://www.example.com/post_it/",data=_data,headers=_headers)
req.content
#{"status":"ok"}

why:

访问http://www.example.com/post_it,服务器自动301到**http://www.example.com/post_it/**了.于是requests就跟随了.

Read more »

win10不断要求认证账户,认证要求输入pin码,输入完后没问题,过一段时间又要求验证.在某种情况下也会导致win10的激活突然消失,甚至在极端的情况下用slmgr -ato也无法再次激活.

Read more »

缘由

一个apk,上burp死活抓不到数据包,应用还正常.
想开wifi热点抓,结果我那破红米不支持5g,win10的热点老是开到5g上,行不通,只能想其他方法.

非实时

tcpdump直接抓
但是不够优雅,不能实时反应过来,而且也没wireshark易用

实时

wifi热点法

垃圾红米手机和win10配不上.

管道法

老早之前记得看过有人用pipe来将抓包的数据实时重定向到wireshark.

Read more »
0%