html tool

显示标签为“编译”的博文。显示所有博文
显示标签为“编译”的博文。显示所有博文

2024年6月11日星期二

nginx编译知道openssl源码,make提示/bin/sh: line 0: cd: auto/lib/openssl/conf: Not a directory 的解决

 问题:

编译参数:

./configure --prefix=/usr/local/nginx --with-openssl=/tool/openssl1.1.0w --with-http_stub_status_module  --with-http_v2_module  --with-http_gzip_static_module  --with-http_sub_module --with-stream --with-stream_ssl_module  --with-http_realip_module  --with-http_gzip_static_module --with-http_ssl_module

结果make是提示问题如下:

# make

make -f objs/Makefile
make[1]: Entering directory `/tool/nginx-1.27.0'
cd auto/lib/openssl/conf \
&& if [ -f Makefile ]; then make clean; fi \
&& ./config --prefix=/tool/nginx-1.27.0/auto/lib/openssl/conf/.openssl no-shared no-threads  \
&& make \
&& make install_sw LIBDIR=lib
/bin/sh: line 0: cd: auto/lib/openssl/conf: Not a directory
make[1]: *** [auto/lib/openssl/conf/.openssl/include/openssl/ssl.h] Error 1
make[1]: Leaving directory `/root/tool/nginx-1.27.0'
make: *** [build] Error 2

解决方式:
将openssl1.1.0w的目录移动为openssl修改编译参数中的
--with-openssl=/tool/openssl1.1.0w
--with-openssl=/tool/openssl 
在编译和make就可以了
PS:我在nginx1.24.0/1.27.0上都遇到这个问题,go了一下大家都在改Makefile文件中的引用,反向改改也ok,想来是./configure脚本对path中的.处理有bug吧

2019年1月23日星期三

转:retn/retf

https://blog.csdn.net/cyousui/article/details/8565219

2.RETN/RETF指令:
  按照前面讲CALL指令举的那个例子,CALL指令是进入子程序的指令,而例子中所说的跳出子程序这一过程也需要2条指令,它们是RETN/RETF。
  RETN/RETF是跳出子程序的指令,被称为返回指令。RETN指令用于从段内转移CALL进的子程序中返回;RETF指令用于从段间转移CALL进的子程序中返回。
  RETN/RETF在反汇编代码中呈现的形式如下:
  RETN
  RETN   操作数1
  RETF
  RETF   操作数1
  RETN等价于一条指令:POP   eip
  RETF等价于两条指令:
  POP   eip
  POP   CS

  而带有操作数的RETN/RETF指令则是在POP之后,执行ESP=ESP+操作数1。

转:CALL指令


https://blog.csdn.net/cyousui/article/details/8565219

1.CALL指令:
  CALL指令可不是如唤指令,而是子程序调用指令。那么汇编语言中的子程序是什么呢?子程序能被其它程序调用,在实现某种功能后能自动返回到调用程序去的程序。其最后一条指令一定是返回指令,故能保证得新返回到调用它的程序中去。也可调用其它子程序,甚至可自身调用。
  我们可以暂时把子程序理解为一个代码段,是一个模块化的代码面。这个代码段可以完成某一特定功能,当程序在执行过程中需要用到这一功能,将会进入这个代码段。这块代码段执行完毕后,会跳出这块代码段。而进入代码段这一过程就是子程序的调用,也就是这里所说的CALL指令所要完成的工作。
  反汇编经常看到的CALL指令的基本格式如下:
  CALL   地址1
  功能:调用地址1处的子程序
  CALL指令分为两种情况,一种是段内转移;另一种是段间转移。这两种情况类似于JMP指令的相对跳转和绝对跳转(只不过相对跳转的JMP指令会有short标识)。
  在CALL指令进行的是段内转移的情况时,跟在CALL后面的地址1为一个相对位移;而CALL指令进行的是段间转移的情况时,跟在CALL后面的地址1为一个绝对内存地址。
  (1)段内转移的CALL指令等价于两条指令:
  push eip
  jmp   目的位置

  也就是说,执行段内转移的CALL指令时,相当于先后执行以上两条指令。
  (2)段间转移的CALL指令等价于三条指令:
  push CS
  push eip
  jmp   目的位置


【popexizhi: 发现asm的指令执行原理是跨平台的,这里只是在不同os上有语法差别,没有结构差别。】

转:函数调用栈


转:https://www.jianshu.com/p/0299f56edab5

1. 栈区(stack)

高地址向低地址生长的一块连续的内存区域,所以栈顶地址和栈的最大容量都是系统预先规定好的;
编译器自动管理;
方式类似数据结构中的栈,后入先出(LIFO);
每个进程在用户态对应一个调用栈结构;
存放函数参数和返回值,函数局部变量(不包括 static 声明的变量,它们存放在静态变量区);
高效快速,但大小限制,数据不灵活(支持数据类型有限,一般是整型,指针,浮点型等系统直接支持的数据类型);

2. 栈帧(stack frame)

函数调用经常是嵌套的,在同一时刻,堆栈中会有多个函数的信息,每个未完成运行的函数占用一个独立连续区域(包含这个函数涉及的参数,局部变量,返回地址等相关信息),称为栈帧。
当调用函数时,就要压入一个新的栈帧,发起调用函数的栈帧成为调用者栈帧,被调用函数的栈帧则称为当前栈帧(rsprbp 之间的内存空间);被调用的函数运行结束后回收栈帧,回到调用者栈帧。这一过程都是自动的,由系统分配与销毁,无需手动调度。

3. 寄存器 (register)

x86-64中,所有寄存器都是64位,相对32位的x86来说,标识符发生了变化,比如:从原来的 %ebp 变成了 %rbp。为了向后兼容性,%ebp 依然可以使用,不过指向了 %rbp 的低32位。






rip 指令地址寄存器,用来存储 CPU 即将要执行的指令地址。每次 CPU 执行完相应的汇编指令之后,rip 寄存器的值就会自行累加;rip 无法直接赋值,call, ret, jmp 等指令可以修改 rip
rbp 栈基地址寄存器,保存当前帧的栈底地址。
rsp 栈指针寄存器,保存当前栈顶。
栈帧中,最重要的是帧指针 rbp 和栈指针 rsp,有了这两个指针,我们就可以刻画一个完整的栈帧。

3.1 寄存器保存惯例

调用者栈帧需要寄存器暂存数据,被调用者栈帧也需要寄存器暂存数据。
如果调用者使用了 rbx,那被调用者就需要在使用之前把 rbx 保存起来,然后在返回调用者栈帧之前,恢复 rbx。遵循该使用规则的寄存器就是被调用者保存寄存器,对于调用者来说, rbx 就是非易失的。
调用者使用 r10 存储局部变量,为了能在子函数调用后还能使用 r10,调用者把 r10 先保存起来,然后在子函数返回之后,再恢复 r10。遵循该使用规则的寄存器就是调用者保存寄存器,对于调用者来说, r10 就是易失的。


4. 函数调用栈

4.1 参数入栈

参数从右向左依次入栈(支持可变参数)。
x86-64 中,有 6 个寄存器来存储参数,多于 6 个参数,依然还是通过入栈实现。

4.2 返回地址入栈

实际代码中我们是看不到 push rip 这句的;
它是包含在 call 指令之中的 call function = push rip + jmp function
x86 Instruction Set Reference

4.3 代码区跳转

它是包含在 call 指令之中的 call function = push rip + jmp function

4.4 栈帧调整

  1. 将调用帧的 push %rbp 入栈。
  2. 切换栈帧到当前栈帧 movq %rsp, %rbp
  3. 抬高栈顶,分配临时数据区 subq &xx, %rsp

[popexizhi: 此文下发值得深入阅读xcode的code分析,next mark]

2018年9月11日星期二

攻击工具-netcat linux编译


源码地址:
https://github.com/bonzini/netcat

当前编译结果保存在: https://github.com/popexizhi/TreasureChest-/tree/attack-tool/nc
使用Makefile.am 和 configure.am编译,pope还是第一使用记录一下:
参考:https://blog.csdn.net/qq_19876131/article/details/51079068


$aclocal  #这里代码的根目录直接执行就可以,没有的 yum install automake
$autoconf  #同上直接执行就可以,autoconf会根据configure.inaclocal.m4文件,生成configure文件
$automake --add-missing # automake会根据Makefile.am文件产生一些文件,包含最重要的Makefile.in。前面所生成的configure,会根据Makefile.in文件,来生成最终的Makefile文件,这里遇到问题记录到下面了
$./configure
$make all-am #编译完成后,当前目录有一个nc就可以使用了 :)
过程问题记录:

I.问题:
[root@lijie-121 netcat]# automake --add-missing
configure.ac:5: error: required file 'config.h.in' not found

解决: (https://github.com/stevedh/readingdb/issues/1)
[root@lijie-121 netcat]# autoreconf --install
[root@lijie-121 netcat]# automake --add-missing

II.问题
$make
...
/root/tool/netcat/config/missing:行81: makeinfo: 未找到命令
WARNING: 'makeinfo' is missing on your system.
         You should only need it if you modified a '.texi' file, or
         any other file indirectly affecting the aspect of the manual.
         You might want to install the Texinfo package:
         
         The spurious makeinfo call might also be the consequence of
         using a buggy 'make' (AIX, DU, IRIX), in which case you might
         want to install GNU make:
         
make[1]: *** [netcat.info] 错误 127
make[1]: 离开目录“/root/tool/netcat”
make: *** [all] 错误 2
解决: (https://blog.csdn.net/xuezhimeng2010/article/details/49070169)
yum install texinfo