0%

原理

众所周知,任何数据在内存中都是以Byte为单位进行存储的,每个Byte包含了8个二进制位,因此本文不区分二进制数据与文本,而是将其作为一个整体进行讨论。

编码

base64编码包括以下几个步骤

  1. 将每个BYTE转为8位二进制
  2. 若二进制位不是6的倍数则在其后面补0直到其变为6的倍数
  3. 将每6个二进制位作为整体转换为10进制
  4. 通过查表将十进制转为字符
  5. 若转出的长度不为4的倍数,则在其后补’=’

注: 转换表见附录

若是以编码 CNSS 为例,则整个过程为

base64encode

阅读全文 »

不用{}<>写一个Hello World程序,本方法基于gcc的编译器

C语言中的函数

在C语言中,一个函数其实可以看做一个变量,假设如今定义了如下函数

1
2
3
4
int fun()
{
return 0;
}

&fun 将会像普通变量一样取得这个函数所在的地址

gcc下main函数调用机制

一个程序,其实并不是以main为开始,而是以start函数为开始

随便将一个ELF文件拖入ida可以看见

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.text:00000000004006E0 _start          proc near               ; DATA XREF: LOAD:0000000000400018↑o
.text:00000000004006E0 ; __unwind {
.text:00000000004006E0 xor ebp, ebp
.text:00000000004006E2 mov r9, rdx ; rtld_fini
.text:00000000004006E5 pop rsi ; argc
.text:00000000004006E6 mov rdx, rsp ; ubp_av
.text:00000000004006E9 and rsp, 0FFFFFFFFFFFFFFF0h
.text:00000000004006ED push rax
.text:00000000004006EE push rsp ; stack_end
.text:00000000004006EF mov r8, offset __libc_csu_fini ; fini
.text:00000000004006F6 mov rcx, offset __libc_csu_init ; init
.text:00000000004006FD mov rdi, offset main ; main
.text:0000000000400704 call ___libc_start_main
.text:0000000000400709 hlt
.text:0000000000400709 ; } // starts at 4006E0
.text:0000000000400709 _start endp
阅读全文 »

不要吐槽文笔,我也很绝望啊

从16年9月到现在已经8个月了,想当初刚来UESTC时还信誓旦旦的说自己一定会参加ACM,如今却和一条咸鱼差不多,现在来看,怕是如今的水平都不如高一刚参加NOIP时。

上星期和队友一起撸了12小时题后,也就撸了5题,侥幸进入决赛,还获得了一条咸鱼T恤

pic

然而决赛的5个小时中也就做了个签到题以及一个tle的E题,虽然没有之前APIO爆0那么可怕,但是还是感觉到自己已经离ACM这条路越来越远。要说这次决赛的收获的话怕是只有一个咸鱼的签到气球以及让我更好的审视自己。

阅读全文 »

在pwn的过程中常常需要通过自己写shellcode来获取shell,本文将介绍几种简单的shellcode
注:本文以x86为基础

调用系统函数

在开始写shellcode时,首先需要想到,我应该如何调用shell呢?

在写C语言中,通常我们需要调用

1
system("/bin/sh")

从而获得shell

在写汇编时,有时候并不需要这么做

linux

在使用linux时写汇编时完全不必再去libc寻找system函数,然后传递参数并且call system,只需要使用 系统调用

阅读全文 »

一个坑爹的问题

这个问题与主题没太大关系,还是提一提吧

在ubuntu16.10后 gcc 编译时默认加上了参数-pie,也就是运行地址随机化,可以更好的抵挡攻击,防pwn,但是出题就比较坑爹了

只需要编译时加上参数-no-pie即可

格式化字符串简介

格式化字符串,是一些程序设计语言在格式化输出API函数中用于指定输出参数的格式与相对位置的字符串参数,例如C、C++等程序设计语言的printf类函数,其中的转换说明(conversion specification)用于把随后对应的0个或多个函数参数转换为相应的格式输出;格式化字符串中转换说明以外的其它字符原样输出。

以上摘自wiki:格式化字符串

为了格式化字符串,需要使用占位符用于指明输出的参数值如何格式化。

在c语言中的printf这一大类函数中(包括vprintf,sprintf等),使用%d,%c,%s等占位符对字符串进行格式化

然而,一些特殊的用法往往被人们忽略了

阅读全文 »

作为一个pwn选手,一个好的动态调试工具肯定少不了,但是linux下并没有OD这样神奇的东西(edb除外),除了ida的远程调试工具外最好的选择就是gdb了。

安装gdb-peda

在调试的时候,原版的gdb使用起来总感觉不是那么舒服,虽然有layout,但是会有一些奇奇怪怪的问题,这个时候选择一个好用的插件便会方便许多,本文选择的是gdb-peda
安装过程十分简单,以安装在~/peda为例,有别的需求可自己更改

1
2
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
阅读全文 »

ngrok已经不再维护了,建议使用frp

如今ipv4资源日渐匮乏,静态公网ip不容易获取,若是想从公网访问本机资源将会变得比较麻烦,ngrok可以通过流量转发来实现内网穿透,让外网更加容易访问本机资源。

准备

  1. 一个有固定公网ip的服务器
  2. 一个域名
  3. 把某个子域名以及其泛解析解析到服务器

例: 将ngrok.plusls.com解析为1.2.3.4

并将*.ngrok.plusls.com解析为1.2.3.4

阅读全文 »

在天朝,由于某些原因,国人访问github的速度异常的慢,尤其是使用git clone项目时。

git目前支持4种协议,git,ssh,http,https,可以通过配置这四种协议的代理来加速git的使用。

本文默认浏览者使用linux系统并且拥有代理服务器

代理ssh协议

安装connect-proxy

1
sudo apt install connect-proxy
阅读全文 »