不用[](){}<>写一个Hello World程序
不用{}<>写一个Hello World程序,本方法基于gcc的编译器
C语言中的函数
在C语言中,一个函数其实可以看做一个变量,假设如今定义了如下函数
1 | int fun() |
则 &fun 将会像普通变量一样取得这个函数所在的地址
gcc下main函数调用机制
一个程序,其实并不是以main为开始,而是以start函数为开始
随便将一个ELF文件拖入ida可以看见
1 | .text:00000000004006E0 _start proc near ; DATA XREF: LOAD:0000000000400018↑o |
过去,现在,将来?
不要吐槽文笔,我也很绝望啊
从16年9月到现在已经8个月了,想当初刚来UESTC时还信誓旦旦的说自己一定会参加ACM,如今却和一条咸鱼差不多,现在来看,怕是如今的水平都不如高一刚参加NOIP时。
上星期和队友一起撸了12小时题后,也就撸了5题,侥幸进入决赛,还获得了一条咸鱼T恤
然而决赛的5个小时中也就做了个签到题以及一个tle的E题,虽然没有之前APIO爆0那么可怕,但是还是感觉到自己已经离ACM这条路越来越远。要说这次决赛的收获的话怕是只有一个咸鱼的签到气球以及让我更好的审视自己。
shellcode
格式化字符串漏洞
一个坑爹的问题
这个问题与主题没太大关系,还是提一提吧
在ubuntu16.10后 gcc 编译时默认加上了参数-pie
,也就是运行地址随机化,可以更好的抵挡攻击,防pwn,但是出题就比较坑爹了
只需要编译时加上参数-no-pie
即可
格式化字符串简介
格式化字符串,是一些程序设计语言在格式化输出API函数中用于指定输出参数的格式与相对位置的字符串参数,例如C、C++等程序设计语言的printf类函数,其中的转换说明(conversion specification)用于把随后对应的0个或多个函数参数转换为相应的格式输出;格式化字符串中转换说明以外的其它字符原样输出。
以上摘自wiki:格式化字符串
为了格式化字符串,需要使用占位符用于指明输出的参数值如何格式化。
在c语言中的printf这一大类函数中(包括vprintf,sprintf等),使用%d,%c,%s等占位符对字符串进行格式化
然而,一些特殊的用法往往被人们忽略了
使用GDB
作为一个pwn选手,一个好的动态调试工具肯定少不了,但是linux下并没有OD这样神奇的东西(edb除外),除了ida的远程调试工具外最好的选择就是gdb了。
安装gdb-peda
在调试的时候,原版的gdb使用起来总感觉不是那么舒服,虽然有layout,但是会有一些奇奇怪怪的问题,这个时候选择一个好用的插件便会方便许多,本文选择的是gdb-peda
安装过程十分简单,以安装在~/peda
为例,有别的需求可自己更改
1 | git clone https://github.com/longld/peda.git ~/peda |