代码还原之 函数

指令堆里逆向出来的代码有歧义,有三处返回,有嵌套IF语句,故推断出是个函数;

复制代码
    #if 0
    /*27ec:	48 8d 3d 58 39 00 00 	lea    0x3958(%rip),%rdi        # 614b <_IO_stdin_used@@Base+0x14b> // rdi="COLUMNS"
    27f3:	e8 e8 fb ff ff       	callq  23e0 <getenv@plt>*/	// getenv(rdi)
    char *ptr_strtol;
    struct winsize p_0xa8;
        /*struct winsize
        {
            unsigned short ws_row; // 窗口字符行数。
            unsigned short ws_col; // 窗口字符列数。
            unsigned short ws_xpixel; // 窗口宽度,象素值。
            unsigned short ws_ypixel; // 窗口高度,象素值。
        };*/
    
	char *p_getenv = getenv("COLUMNS");

    /*27f8:	48 85 c0             	test   %rax,%rax			// rax="113"
    27fb:	74 09                	je     2806 <__sprintf_chk@plt+0x96>	// no
    27fd:	80 38 00             	cmpb   $0x0,(%rax)			// 0-0x31, so zf=0
    2800:	0f 85 1e 07 00 00    	jne    2f24 <__sprintf_chk@plt+0x7b4>*/	// if zf=0 than jump
    
	if ((p_getenv != NULL) && (*p_getenv != 0)) {
			// goto 2f24 --> 283a
            col = strtol(p_getenv, &ptr_strtol, 0);
            printf("col = %d\n", col);

            if ( (!*ptr_strtol) && (col > 0) && (col < 0x7ffffffd))

	} else {

    /*2806:	48 8d 94 24 a8 00 00 	lea    0xa8(%rsp),%rdx  // rdx=(rsp+0xa8)=struct winsize p_0xa8
    280d:	00 
    280e:	be 13 54 00 00       	mov    $0x5413,%esi
    2813:	bf 01 00 00 00       	mov    $0x1,%edi
    2818:	31 c0                	xor    %eax,%eax
    281a:	e8 51 fd ff ff       	callq  2570 <ioctl@plt>
    281f:	41 89 c0             	mov    %eax,%r8d*/          // r8d=ret,把返回值存起来, 此处有可能是一个函数调用的返回。
    
        // include/uapi/asm-generic/ioctls.h:38:#define TIOCGWINSZ 0x5413
        ret = ioctl(1, 0x5413, &p_0xa8);
        printf("ret = %d, 0x%x\n", ret, p_0xa8.ws_row);    
        col = 0x84;
    
    /*2822:	b8 84 00 00 00       	mov    $0x84,%eax   // 0x84=132
    2827:	45 85 c0             	test   %r8d,%r8d    // r8d=ret
    282a:	78 0e                	js     283a <__sprintf_chk@plt+0xca>    SF = 1 负数, jump
    282c:	0f b7 8c 24 aa 00 00 	movzwl 0xaa(%rsp),%ecx  // (rsp+0xaa)=p_0xa8.ws_col,通过查看内存值可以判断结构的成员及大小
    2833:	00 
    2834:	66 85 c9             	test   %cx,%cx          // cx=cx&0xff
    2837:	0f 45 c1             	cmovne %ecx,%eax */     // cmovne 不等传送
        if (ret >= 0) {
            if (p_0xa8.ws_col != 0) {
                col = p_0xa8.ws_col;
            }
        }
    }
    #endif

    col = get_ws_col();

    /*283a:	48 8d 35 2b 3a 00 00 	lea    0x3a2b(%rip),%rsi        # 626c <_IO_stdin_used@@Base+0x26c> // ""
    2841:	bf 06 00 00 00       	mov    $0x6,%edi
    2846:	89 05 78 6a 00 00    	mov    %eax,0x6a78(%rip)        # 92c4 <_IO_stdin_used@@Base+0x32c4> // 0x55555555684c+0x6a78=0x55555555d2c4=113
    284c:	e8 4f fe ff ff       	callq  26a0 <setlocale@plt>*/

int get_ws_col()

{

char *ptr_strtol;

struct winsize p_0xa8 = {0};

int col = 0;

char *p_getenv = getenv("COLUMNS");

if ((p_getenv != NULL) && (*p_getenv != 0)) {

col = strtol(p_getenv, &ptr_strtol, 0);

printf("col = %d\n", col);

if ( (!*ptr_strtol) && (col > 0) && (col < 0x7ffffffd)) {

return col;

}

}

if (ioctl(1, 0x5413, &p_0xa8) >= 0) {

if (p_0xa8.ws_col != 0) {

return p_0xa8.ws_col;

}

}

reutrn 0x84;

}

相关推荐
Darkwanderor10 分钟前
Linux线程控制
linux·c语言·c++
Brilliantwxx16 分钟前
【Linux】 开发|Git 版本控制与 gdb/cgdb 调试
linux·笔记·git
allforgood31 分钟前
管理 SELinux 安全性
linux·运维·网络
Darkwanderor39 分钟前
多线程的互斥问题和互斥锁解决互斥问题
linux·c语言·c++
数智工坊1 小时前
UECP:不确定性增强的协同感知 | 基于物理先验的BEV融合新范式
linux·ubuntu·3d·机器人
ltl10 小时前
内核追踪:ftrace、kprobe、uprobe、tracepoint 生产实战
linux
·薯条大王10 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
小小、码农13 小时前
Linux进程控制:从fork到exec,手写一个简易Shell
linux·运维·服务器
不会就选b13 小时前
Linux之进程间通信(二)---模拟进程池
linux·运维·服务器
沫璃染墨15 小时前
《从零入门Linux系统篇(十五):系统工具篇·六——GDB调试器详解:从程序执行控制到高级调试技巧》
linux·运维·服务器·c语言·c++