指令堆里逆向出来的代码有歧义,有三处返回,有嵌套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;
}