网站关键词如何优化/绍兴seo排名收费
文章目录
- 相关字节标识
- 导入函数和导出函数
- 找程序入口函数
- 选项设置
- 重命名
- CISCN2023华中赛区分区赛AWD
- IDA源码
- main
- 构造结构体
- sub_141B()
- 打开局部变量类型的视图
- 增加变量类型
- 重新定义变量类型
- 再次设置变量类型并重新定义
- 再次设置变量类型并重新定义
- 再次设置变量类型并重新定义
- 设置函数名
- 标记已经分析完
- 找到引用函数的各个地方
- 对变量重新定义变量类型
- 转换为字符
- 格式化字符串"\x1B[36mmybash:%s$ \x1B[0m"
- sub_25D5()
- -1转换与相关变量与函数命名
- 设置sub_25D5()
- sub_247F(char *a1)
- 设置sub_247F(char *a1)函数
- sub_23CA(const char **a1)
- 设置sub_23CA(const char **a1)函数
- sub_1523()
- 设置sub_1523()函数
- h更换数据形式
- 更改各个函数名
- __int64 __fastcall command_touch(__int64 a1)
- 修改后的__int64 __fastcall command_touch(__int64 a1)
- __int64 __fastcall command_mkdir(__int64 a1)
- 修改后的__int64 __fastcall command_mkdir(const char **args)
- 此时发现void sub_13C8()函数又跳转
- 注意
- 修改后的__int64 __fastcall command_cat(const char **args)
- 修改后的__int64 __fastcall command_rm(const char **args)
- 修改后的__int64 __fastcall command_echo(char **args)
- 修改后的__int64 __fastcall command_cd(char **arg)
2023华中pwn题逆向参考视频教程
相关字节标识
_WORD(1个字=2个字节=16位)
_DWORD(2个字=4个字节=32位)
_QWORD(4个字=8个字节=64位)
_OWORD(8个字=16个字节=128位
DB (Define Byte): 用于定义单字节(8位)的数据。
DW (Define Word): 用于定义字(Word)大小的数据,通常为2字节(16位)。
DD (Define Doubleword): 用于定义双字(Doubleword)大小的数据,通常为4字节(32位)。
DQ (Define Quadword): 用于定义四字(Quadword)大小的数据,通常为8字节(64位)。
导入函数和导出函数
在C语言中,导入函数和导出函数是实现模块化编程的关键技术,它们分别用于在不同模块之间共享和使用函数。以下是具体分析:
- 导出函数:在C语言中,当一个函数被声明为导出时,它意味着这个函数可以在其他模块中被调用。这通常通过特定的编译器指令或关键字来实现,例如在Windows平台的C/C++中使用__declspec(dllexport)来导出DLL中的函数。
- 导入函数:与导出函数相对应,导入函数是指在当前模块中引用外部模块定义的函数。在C语言中,导入函数通常涉及到包含相应的头文件,并且确保链接时包含了定义这些函数的目标文件或库文件。
找程序入口函数
export找到start,start中找到main
选项设置
重命名
CISCN2023华中赛区分区赛AWD
IDA源码
main
__int64 __fastcall main(int a1, char **a2, char **a3)
{int v4; // [rsp+Ch] [rbp-14h]void *ptr; // [rsp+10h] [rbp-10h]void *v6; // [rsp+18h] [rbp-8h]setvbuf(stdin, 0LL, 2, 0LL);setvbuf(stdout, 0LL, 2, 0LL);setvbuf(stderr, 0LL, 2, 0LL);alarm(0x20u);qword_50E0 = sub_141B();*(_DWORD *)qword_50E0 = 0;qword_5150 = qword_50E0;*(_BYTE *)(qword_50E0 + 4) = 47;strncpy(dest, (const char *)(qword_50E0 + 4), 1uLL);do{printf("\x1B[36mmybash:%s$ \x1B[0m", dest);ptr = (void *)sub_25D5();v6 = (void *)sub_247F(ptr);v4 = sub_23CA(v6);free(ptr);free(v6);}while ( v4 );return 0LL;
}
构造结构体
sub_141B()
该函数对建立的堆的不同位置进行变量设置,为了更方便的查看设置的位置,可以设置一个结构体来替代
_QWORD *sub_141B()
{_QWORD *v1; // [rsp+8h] [rbp-8h]v1 = malloc(0x40uLL);if ( !v1 )_exit(0);memset((char *)v1 + 4, 0, 0x10uLL);v1[7] = 0LL;v1[5] = 0LL;v1[4] = 0LL;v1[6] = 0LL;return v1;
}
打开局部变量类型的视图
增加变量类型
重新定义变量类型
然后代码变为
SomeStruct *sub_141B()
{SomeStruct *v1; // [rsp+8h] [rbp-8h]v1 = (SomeStruct *)malloc(0x40uLL);if ( !v1 )_exit(0);memset(&v1->gap[4], 0, 0x10uLL);*(_QWORD *)&v1->gap[56] = 0LL;*(_QWORD *)&v1->gap[40] = 0LL;*(_QWORD *)&v1->gap[32] = 0LL;*(_QWORD *)&v1->gap[48] = 0LL;return v1;
}
发现在距离起始四个字节后的十六个字节都设置为0memset(&v1->gap[4], 0, 0x10uLL);
memset函数
memset函数是C语言标准库中的一个用于内存操作的函数,它主要用于将某一块内存空间的内容设置为指定的值。
memset函数的原型为:
void *memset(void *s, int c, size_t n);
- void *s:指向要填充的内存块的指针。
- int c:需要设置的值,该值会被转换为无符号字符后用来设置内存块。
- size_t n:要设置的内存块的字节数。
再次设置变量类型并重新定义
结果代码
SomeStruct *sub_141B()
{SomeStruct *v1; // [rsp+8h] [rbp-8h]v1 = (SomeStruct *)malloc(0x40uLL);if ( !v1 )_exit(0);memset(v1->some_array, 0, sizeof(v1->some_array));*(_QWORD *)&v1->gap[36] = 0LL;*(_QWORD *)&v1->gap[20] = 0LL;*(_QWORD *)&v1->gap[12] = 0LL;*(_QWORD *)&v1->gap[28] = 0LL;return v1;
}
再次设置变量类型并重新定义
SomeStruct *sub_141B()
{SomeStruct *v1; // [rsp+8h] [rbp-8h]v1 = (SomeStruct *)malloc(0x40uLL);if ( !v1 )_exit(0);memset(v1->some_array, 0, sizeof(v1->some_array));*(_QWORD *)&v1->gap[24] = 0LL;*(_QWORD *)&v1->gap[8] = 0LL;*(_QWORD *)v1->gap = 0LL;*(_QWORD *)&v1->gap[16] = 0LL;return v1;
}
再次设置变量类型并重新定义
SomeStruct *sub_141B()
{SomeStruct *v1; // [rsp+8h] [rbp-8h]v1 = (SomeStruct *)malloc(0x40uLL);if ( !v1 )_exit(0);memset(v1->some_array, 0, sizeof(v1->some_array));v1->ptr56 = 0LL;v1->ptr40 = 0LL;v1->ptr32 = 0LL;v1->ptr48 = 0LL;return v1;
}
设置函数名
标记已经分析完
找到引用函数的各个地方
对变量重新定义变量类型
__int64 __fastcall main(int a1, char **a2, char **a3)
{int v4; // [rsp+Ch] [rbp-14h]void *ptr; // [rsp+10h] [rbp-10h]void *v6; // [rsp+18h] [rbp-8h]setvbuf(stdin, 0LL, 2, 0LL);setvbuf(stdout, 0LL, 2, 0LL);setvbuf(stderr, 0LL, 2, 0LL);alarm(0x20u);qword_50E0 = SomeStruct::CreateInstance();qword_50E0->unkown_0 = 0;qword_5150 = qword_50E0;qword_50E0->some_array[0] = 47;strncpy(dest, qword_50E0->some_array, 1uLL);do{printf("\x1B[36mmybash:%s$ \x1B[0m", dest);ptr = (void *)sub_25D5();v6 = (void *)sub_247F(ptr);v4 = sub_23CA(v6);free(ptr);free(v6);}while ( v4 );return 0LL;
}
转换为字符
格式化字符串"\x1B[36mmybash:%s$ \x1B[0m"
字符串 “\x1B[36mmybash:%s$ \x1B[0m” 是一个包含ANSI转义序列的字符串,用于在终端上显示颜色文本。在这个字符串中:
\x1B[36m 是一个ANSI转义序列,用于将随后的文本颜色设置为青色(Cyan)。\x1B 是ESC字符的十六进制表示,[ 表示转义序列的开始,36 是选择青色的颜色代码,而 m 表示结束这个颜色设置。
mybash:%s$ 是实际要显示的文本,其中 %s 可能是一个占位符,用于格式化字符串时替换为某个特定的值。
\x1B[0m 是另一个ANSI转义序列,用于重置文本颜色到默认设置。这里 0 表示默认颜色,而 m 同样表示结束这个设置。
sub_25D5()
_BYTE *sub_25D5()
{int v1; // [rsp+Ch] [rbp-14h]int v2; // [rsp+10h] [rbp-10h]int v3; // [rsp+14h] [rbp-Ch]_BYTE *ptr; // [rsp+18h] [rbp-8h]v1 = 528;v2 = 0;ptr = malloc(0x210uLL);if ( !ptr )_exit(0);while ( 1 ){v3 = getchar();if ( v3 == -1 || v3 == 10 )break;ptr[v2++] = v3;if ( v2 >= v1 && v1 <= 2147483639 ){v1 += 496;ptr = realloc(ptr, v1);if ( !ptr ){fwrite("mybash: allocation error\n", 1uLL, 0x19uLL, stderr);exit(1);}}}ptr[v2] = 0;return ptr;
}
-1转换与相关变量与函数命名
设置sub_25D5()
这里根据每次输入一个字符将分配得到的堆指针设置为字符指针类型
void __fastcall read_line()
{int high; // [rsp+Ch] [rbp-14h]int i; // [rsp+10h] [rbp-10h]int tmp_char; // [rsp+14h] [rbp-Ch]char *input_content_line; // [rsp+18h] [rbp-8h]high = 528;i = 0;input_content_line = (char *)malloc(0x210uLL);if ( !input_content_line )_exit(0);while ( 1 ){tmp_char = getchar();if ( tmp_char == (unsigned int)EOF || tmp_char == '\n' )break;input_content_line[i++] = tmp_char;if ( i >= high && high <= 2147483639 ){high += 496;input_content_line = (char *)realloc(input_content_line, high);if ( !input_content_line ){fwrite("mybash: allocation error\n", 1uLL, 0x19uLL, stderr);exit(1);}}}input_content_line[i] = 0;
}
sub_247F(char *a1)
_QWORD *__fastcall sub_247F(char *a1)
{int v2; // [rsp+10h] [rbp-20h]int v3; // [rsp+14h] [rbp-1Ch]_QWORD *ptr; // [rsp+18h] [rbp-18h]char *i; // [rsp+20h] [rbp-10h]_QWORD *v6; // [rsp+28h] [rbp-8h]v2 = 64;v3 = 0;v6 = malloc(0x200uLL);if ( !v6 )_exit(0);ptr = v6;for ( i = strtok(a1, " \t\r\n\a"); i; i = strtok(0LL, " \t\r\n\a") ){ptr[v3++] = i;if ( v3 >= v2 ){v2 += 64;ptr = realloc(ptr, 8LL * v2);if ( !ptr ){fwrite("mybash: allocation error\n", 1uLL, 0x19uLL, stderr);exit(1);}}}ptr[v3] = 0LL;return ptr;
}
设置sub_247F(char *a1)函数
这里i是地址,所以ptr应该是双指针
char **__fastcall split_string(char *content_line)
{int high; // [rsp+10h] [rbp-20h]int cur_pos; // [rsp+14h] [rbp-1Ch]char **split_content_ptr; // [rsp+18h] [rbp-18h]char *one_split_content_ptr; // [rsp+20h] [rbp-10h]char **temp_chunk_ptr; // [rsp+28h] [rbp-8h]high = 64;cur_pos = 0;temp_chunk_ptr = (char **)malloc(0x200uLL);if ( !temp_chunk_ptr )_exit(0);split_content_ptr = temp_chunk_ptr;for ( one_split_content_ptr = strtok(content_line, " \t\r\n\a");one_split_content_ptr;one_split_content_ptr = strtok(0LL, " \t\r\n\a") ){split_content_ptr[cur_pos++] = one_split_content_ptr;if ( cur_pos >= high ){high += 64;split_content_ptr = (char **)realloc(split_content_ptr, 8LL * high);if ( !split_content_ptr ){fwrite("mybash: allocation error\n", 1uLL, 0x19uLL, stderr);exit(1);}}}split_content_ptr[cur_pos] = 0LL;return split_content_ptr;
}
sub_23CA(const char **a1)
__int64 __fastcall sub_23CA(const char **a1)
{int i; // [rsp+1Ch] [rbp-4h]if ( !*a1 )return 1LL;for ( i = 0; i < (int)sub_1523(); ++i ){if ( !strcmp(*a1, (const char *)*(&off_5020 + i)) )return ((__int64 (__fastcall *)(const char **))funcs_2446[i])(a1);}printf("%s: ERROR\n", *a1);return 0LL;
}
设置sub_23CA(const char **a1)函数
__int64 __fastcall instruction_proccess(const char **split_content_ptr_array)
{int i; // [rsp+1Ch] [rbp-4h]if ( !*split_content_ptr_array )return 1LL;for ( i = 0; i < (int)return_7(); ++i ){if ( !strcmp(*split_content_ptr_array, struction_name_ptr_array[i]) )return struction_function_ptr_array[i](split_content_ptr_array);}printf("%s: ERROR\n", *split_content_ptr_array);return 0LL;
}
sub_1523()
__int64 sub_1523()
{return 7LL;
}
设置sub_1523()函数
__int64 return_7()
{return 7LL;
}
h更换数据形式
对应的各个字符串
更改各个函数名
__int64 __fastcall command_touch(__int64 a1)
__int64 __fastcall command_touch(__int64 a1)
{int v2; // [rsp+1Ch] [rbp-14h]void *ptr56; // [rsp+20h] [rbp-10h]SomeStruct *Instance; // [rsp+28h] [rbp-8h]v2 = 1;if ( !*(_QWORD *)(a1 + 8) )fwrite("mybash: missing operand\n", 1uLL, 0x18uLL, stderr);while ( *(_QWORD *)(8LL * v2 + a1) ){ptr56 = qword_5150->ptr56;if ( (unsigned __int8)sub_13C9((__int64)ptr56, *(const char **)(8LL * v2 + a1)) != 1 ){++v2;}else{Instance = SomeStruct::CreateInstance();Instance->unkown_0 = 1;sub_166E(Instance, *(_QWORD *)(8LL * v2 + a1));if ( qword_5150->ptr56 )sub_1628(ptr56, Instance);elseqword_5150->ptr56 = Instance;++v2;}}return 1LL;
}
修改后的__int64 __fastcall command_touch(__int64 a1)
__int64 __fastcall command_touch(char **args)
{int parameter_position; // [rsp+1Ch] [rbp-14h]SomeStruct *main_save_instance_ptr_of_first_file_ptr; // [rsp+20h] [rbp-10h]SomeStruct *Instance_ptr; // [rsp+28h] [rbp-8h]parameter_position = 1;if ( !args[1] )fwrite("mybash: missing operand\n", 1uLL, 0x18uLL, stderr);while ( args[parameter_position] ){main_save_instance_ptr_of_first_file_ptr = main_save_instance_ptr->first_son;if ( (unsigned __int8)SomeStruct::Folder_Not_Eixst(main_save_instance_ptr_of_first_file_ptr,args[parameter_position]) != 1 ){++parameter_position;}else{Instance_ptr = SomeStruct::CreateInstance();Instance_ptr->isfile = 1;SomeStruct::set_some_array(Instance_ptr, args[parameter_position]);if ( main_save_instance_ptr->first_son )sub_1628(main_save_instance_ptr_of_first_file_ptr, Instance_ptr);elsemain_save_instance_ptr->first_son = Instance_ptr;++parameter_position;}}return 1LL;
}
__int64 __fastcall command_mkdir(__int64 a1)
__int64 __fastcall command_mkdir(__int64 a1)
{char v1; // alint v3; // [rsp+1Ch] [rbp-14h]void *ptr56; // [rsp+20h] [rbp-10h]SomeStruct *Instance; // [rsp+28h] [rbp-8h]v3 = 1;if ( !*(_QWORD *)(a1 + 8) )fwrite("mybash: missing operand\n", 1uLL, 0x18uLL, stderr);while ( *(_QWORD *)(8LL * v3 + a1) ){ptr56 = qword_5150->ptr56;((void (__fastcall *)())((char *)&sub_13C8 + 1))();if ( v1 != 1 ){fprintf(stderr, aMybashCannotCr, *(_QWORD *)(8LL * v3++ + a1));}else{Instance = SomeStruct::CreateInstance();Instance->unkown_0 = 0;Instance->ptr48 = qword_5150;sub_166E(Instance, *(_QWORD *)(8LL * v3 + a1));if ( qword_5150->ptr56 )sub_1628(ptr56, Instance);elseqword_5150->ptr56 = Instance;++v3;}}return 1LL;
}
void sub_13C8()
{JUMPOUT(0x13CALL);
}
修改后的__int64 __fastcall command_mkdir(const char **args)
__int64 __fastcall command_mkdir(const char **args)
{// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]parameter_position = 1;if ( !args[1] )fwrite("mybash: missing operand\n", 1uLL, 0x18uLL, stderr);while ( args[parameter_position] ){main_save_instance_ptr_of_first = main_save_instance_ptr->first_son;if ( (unsigned __int8)SomeStruct::Folder_Not_Eixst(main_save_instance_ptr_of_first, args[parameter_position]) != 1 ){fprintf(stderr, aMybashCannotCr, args[parameter_position++]);}else{mkdir_create_Instance_ptr = SomeStruct::CreateInstance();mkdir_create_Instance_ptr->isfile = 0; // 0为目录mkdir_create_Instance_ptr->parent = main_save_instance_ptr;SomeStruct::set_some_array(mkdir_create_Instance_ptr, args[parameter_position]);if ( main_save_instance_ptr->first_son )sub_1628(main_save_instance_ptr_of_first, mkdir_create_Instance_ptr);elsemain_save_instance_ptr->first_son = mkdir_create_Instance_ptr;++parameter_position;}}return 1LL;
}
此时发现void sub_13C8()函数又跳转
Tab键:反编译
先
最后得到的原void sub_13C8()函数
__int64 __fastcall sub_13C9(__int64 a1, const char *a2)
{while ( a1 ){if ( !strcmp((const char *)(a1 + 4), a2) )return 0LL;a1 = *(_QWORD *)(a1 + 40);}return 1LL;
}
注意
当一个函数分析有点棘手时可以查看其他引用该函数的地方
修改后的__int64 __fastcall command_cat(const char **args)
__int64 __fastcall command_cat(const char **args)
{unsigned __int64 high_parament_length_16; // raxvoid *v2; // rsp_BYTE v4[8]; // [rsp+8h] [rbp-70h] BYREFconst char **args_save; // [rsp+10h] [rbp-68h]char v6; // [rsp+1Fh] [rbp-59h]int parament_longest_length_more1; // [rsp+20h] [rbp-58h]int parameter_position; // [rsp+24h] [rbp-54h]SomeStruct *first_son; // [rsp+28h] [rbp-50h]__int64 parament_longest_length_more; // [rsp+30h] [rbp-48h]char *cat_file_name; // [rsp+38h] [rbp-40h]unsigned __int64 v12; // [rsp+40h] [rbp-38h]args_save = args;v12 = __readfsqword(0x28u);parameter_position = 0;v6 = 0;parament_longest_length_more1 = 0;first_son = 0LL;while ( args_save[++parameter_position] ){if ( strlen(args_save[parameter_position]) > parament_longest_length_more1 )parament_longest_length_more1 = strlen(args_save[parameter_position]) + 1;}parament_longest_length_more = parament_longest_length_more1 - 1LL;high_parament_length_16 = 16 * ((parament_longest_length_more1 + 15LL) / 0x10uLL);while ( v4 != &v4[-(high_parament_length_16 & 0xFFFFFFFFFFFFF000LL)] );v2 = alloca(high_parament_length_16 & 0xFFF);if ( (high_parament_length_16 & 0xFFF) != 0 )*&v4[(high_parament_length_16 & 0xFFF) - 8] = *&v4[(high_parament_length_16 & 0xFFF) - 8];cat_file_name = v4; // 上面都没啥用,v2,v4后面都没用到parameter_position = 1;if ( !args_save[1] )fwrite("mybash: missing operand\n", 1uLL, 0x18uLL, stderr);while ( args_save[parameter_position] ){first_son = current_directory_ptr->first_son;strcpy(cat_file_name, args_save[parameter_position]);while ( first_son ){if ( !strcmp(cat_file_name, first_son->file_name) ){if ( first_son->file_content_ptr )puts(first_son->file_content_ptr);v6 = 1;break;}first_son = first_son->next_ptr;}if ( v6 != 1 )fprintf(stderr, "mybash: %s: No such file or directory\n", args_save[parameter_position]);++parameter_position;}return 1LL;
}
修改后的__int64 __fastcall command_rm(const char **args)
__int64 __fastcall command_rm(const char **args)
{// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]parameter_position = 1;if ( !args[1] )fwrite("mybash: missing operand\n", 1uLL, 0x18uLL, stderr);while ( args[parameter_position] ){son_file = current_directory_ptr->first_son;success_flag = 0;while ( son_file ){if ( !strcmp(son_file->file_name, args[parameter_position]) ){success_flag = 1;if ( IsFile(son_file) ){memset(son_file->file_name, 0, sizeof(son_file->file_name));if ( son_file->file_content_ptr )free(son_file->file_content_ptr);SomeStruct::unlink_file(son_file);}else{fprintf(stderr, "mybash: '%s': Is a directory\n", args[parameter_position]);}break;}son_file = son_file->next_ptr;}if ( success_flag != 1 )fprintf(stderr, "mybash: '%s': No such file or directory\n", args[parameter_position]);++parameter_position;}return 1LL;
}
修改后的__int64 __fastcall command_echo(char **args)
__int64 __fastcall command_echo(char **args)
{SomeStruct *v2; // rbxSomeStruct *v3; // rbxint parameter_position; // [rsp+14h] [rbp-3Ch]int i; // [rsp+14h] [rbp-3Ch]int content_length; // [rsp+18h] [rbp-38h]int last_parameter_position; // [rsp+1Ch] [rbp-34h]int input_content_length; // [rsp+24h] [rbp-2Ch]SomeStruct *current_son_file; // [rsp+28h] [rbp-28h] BYREFconst char *last_parameter_ptr; // [rsp+30h] [rbp-20h]unsigned __int64 v11; // [rsp+38h] [rbp-18h]v11 = __readfsqword(0x28u);parameter_position = 0;if ( args[1] ){do++parameter_position;while ( args[parameter_position] );last_parameter_position = parameter_position - 1;if ( Is_No_Echo_to_File(args[parameter_position - 2]) ){for ( i = 1; i < last_parameter_position; ++i )printf(args[i]);puts(args[last_parameter_position]);return 1LL;}else{current_son_file = current_directory_ptr->first_son;last_parameter_ptr = args[last_parameter_position];if ( Is_Exist_File(¤t_son_file, last_parameter_ptr) != 1 ){fprintf(stderr, "mybash: %s: No such file\n", last_parameter_ptr);return 1LL;}else if ( IsFile(current_son_file) ){if ( current_son_file->file_content_ptr ){content_length = SomeStruct::Get_Content_length(current_son_file->file_content_ptr);}else{content_length = 0x1F0;v2 = current_son_file;v2->file_content_ptr = malloc(0x1F0uLL);if ( !current_son_file->file_content_ptr )_exit(0);}input_content_length = strlen(args[last_parameter_position - 2]);while ( input_content_length > content_length )content_length += 0x1F0;if ( content_length > SomeStruct::Get_Content_length(current_son_file->file_content_ptr) ){v3 = current_son_file;v3->file_content_ptr = realloc(current_son_file->file_content_ptr, content_length);}strncpy(current_son_file->file_content_ptr, args[last_parameter_position - 2], input_content_length);return 1LL;}else{fprintf(stderr, "mybash: %s: Is a directory\n", last_parameter_ptr);return 1LL;}}}else{putchar(10);return 1LL;}
}
修改后的__int64 __fastcall command_cd(char **arg)
__int64 __fastcall command_cd(char **arg)
{size_t dest_length; // rbxsize_t current_file_name_length; // raxint main_save_instance_ptr_file_name_length; // [rsp+18h] [rbp-38h]const char *after_dlim_para; // [rsp+20h] [rbp-30h]SomeStruct *current_file; // [rsp+28h] [rbp-28h]char delim[2]; // [rsp+36h] [rbp-1Ah] BYREFunsigned __int64 v8; // [rsp+38h] [rbp-18h]v8 = __readfsqword(0x28u);if ( arg[1] ){if ( arg[2] ){fwrite("mybash: too many arguments\n", 1uLL, 0x1BuLL, stderr);}else{strcpy(delim, "/");for ( after_dlim_para = strtok(arg[1], delim); after_dlim_para; after_dlim_para = strtok(0LL, delim) ){if ( strcmp(after_dlim_para, ".") ){if ( !strcmp(after_dlim_para, "..") ){if ( current_directory_ptr->parent ){main_save_instance_ptr_file_name_length = strlen(current_directory_ptr->file_name);current_directory_path[(strlen(current_directory_path) - 1 - main_save_instance_ptr_file_name_length)] = 0;current_directory_ptr = current_directory_ptr->parent;// 当前目录更新为之前目录的父目录}}else{current_file = current_directory_ptr->first_son;if ( SomeStruct::File_Not_Eixst(current_file, after_dlim_para) ){fprintf(stderr, "mybash: %s: No such file or directory\n", after_dlim_para);return 1LL;}while ( current_file && strcmp(current_file->file_name, after_dlim_para) )current_file = current_file->next_ptr;if ( !SomeStruct::IsDirectory(current_file) ){fwrite("something wrong happened\n", 1uLL, 0x19uLL, stderr);return 1LL;}current_directory_ptr = current_file;dest_length = strlen(current_directory_path);if ( dest_length + strlen(current_file->file_name) + 1 <= 0x4F ){current_file_name_length = strlen(current_file->file_name);strncat(current_directory_path, current_file->file_name, current_file_name_length);*¤t_directory_path[strlen(current_directory_path)] = 47;}}}}}}else{fwrite("mybash: expected argument\n", 1uLL, 0x1AuLL, stderr);}return 1LL;
}
相关文章:

IDA使用-2023CICSN华中赛区pwn题逆向为例
文章目录 相关字节标识导入函数和导出函数找程序入口函数选项设置重命名CISCN2023华中赛区分区赛AWDIDA源码main 构造结构体sub_141B() 打开局部变量类型的视图增加变量类型重新定义变量类型再次设置变量类型并重新定义再次设置变量类型并重新定义再次设置变量类型并重新定义 设…...

安装虚拟机出现的一些问题
1、在重新打开软件之后出现闪退 解决:[WSL] 解决nsenter: cannot open /proc/320/ns/time: No such file or directory 问题 小白向-CSDN博客2、重新启动xrdp服务命令 解决: sudo systemctl restart xrdp3、将端口从3389改为3390,因为此前…...

Git+py+ipynb Usage
0.default config ssh-keygen -t rsa #之后一路回车,当前目录.ssh/下产生公私钥 cat ~/.ssh/id_rsa.pub #复制公钥到账号 git config --global user.email account_email git config --global user.name account_namebug of ipynb TqdmWarning: IProgress not found. Please …...

eBPF实践篇之环境搭建
文章目录 前言实验环境前置知识配置开发环境最后 前言 你好,我是醉墨居士,本次我们学习一下eBPF,我们基于libbpf-bootstrap来进行我们的eBPF程序开发🤗 实验环境 一台Debian12操作系统的计算机,我使用的是Debian12.…...

机器学习科普及学习路线
机器学习是一种让计算机系统通过从数据中学习来改进性能的方法。它的学习方法主要包括监督学习、无监督学习和强化学习。下面我将详细解释机器学习的概念、学习方法和学习路线。 1. 机器学习概念: 机器学习是一种人工智能的分支,旨在使计算机系统能够从…...

如何在本地电脑部署HadSky论坛并发布至公网可远程访问【内网穿透】
文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3 Cpolar稳定隧道(本地设置)2.4 公网访问测试 总结 前言 经过多年的基础…...

Spring Boot 笔记 025 主界面
1.1 路由搭建 1.1.1 安装vue router npm install vue-router4 1.1.2 在src/router/index.js中创建路由器,并导出 import { createRouter, createWebHistory } from vue-router//导入组件 import LoginVue from /views/Login.vue import LayoutVue from /views/La…...

(done) Positive Semidefinite Matrices 什么是半正定矩阵?如何证明一个矩阵是半正定矩阵? 可以使用特征值
参考视频:https://www.bilibili.com/video/BV1Vg41197ew/?vd_source7a1a0bc74158c6993c7355c5490fc600 参考资料(半正定矩阵的定义):https://baike.baidu.com/item/%E5%8D%8A%E6%AD%A3%E5%AE%9A%E7%9F%A9%E9%98%B5/2152711?frge_ala 看看半正定矩阵的…...

七、矩阵的初等变换
目录 -1. 介绍 0、增广矩阵: 1、初等变换的性质: 编辑2、矩阵初等变换的分类: 2.1 普通的行阶梯矩阵: 2.2 、行最简形矩阵: 2.3、标准形矩阵: 3、初等变换的定理: 4、初等变换的应用&…...

CSS background-size
background-size 菜鸟教程 CSS3 background-size 属性 MDN Web 开发技术>CSS:层叠样式表>background-size CSS的background 背景图片自动适应元素大小,实现img的默认效果 background-size:100% 100%; 在CSS中,background-size属性用…...

【机器学习】特征工程之特征选择
🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…...

Java中PDF文件传输有哪些方法?
专栏集锦,大佬们可以收藏以备不时之需: Spring Cloud 专栏:http://t.csdnimg.cn/WDmJ9 Python 专栏:http://t.csdnimg.cn/hMwPR Redis 专栏:http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏:http://t.csdni…...

前后端分离Vue+ElementUI+nodejs蛋糕甜品商城购物网站95m4l
本文主要介绍了一种基于windows平台实现的蛋糕购物商城网站。该系统为用户找到蛋糕购物商城网站提供了更安全、更高效、更便捷的途径。本系统有二个角色:管理员和用户,要求具备以下功能: (1)用户可以修改个人信息&…...

Pytorch 复习总结 3
Pytorch 复习总结,仅供笔者使用,参考教材: 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为:Pytorch 多层感知机。 本文先介绍了多层感知机的用法,再就训练过程中经常出现的过拟…...

2024年危险化学品经营单位主要负责人证考试题库及危险化学品经营单位主要负责人试题解析
题库来源:安全生产模拟考试一点通公众号小程序 2024年危险化学品经营单位主要负责人证考试题库及危险化学品经营单位主要负责人试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特…...

go使用trpc案例
1.go下载trpc go install trpc.group/trpc-go/trpc-cmdline/trpclatest 有报错的话尝试配置一些代理(选一个) go env -w GOPROXYhttps://goproxy.cn,direct go env -w GOPROXYhttps://goproxy.io,direct go env -w GOPROXYhttps://goproxy.baidu.com/…...

nodejs+vue+ElementUi废品废弃资源回收系统
系统主要是以后台管理员管理为主。管理员需要先登录系统然后才可以使用本系统,管理员可以对系统用户管理、用户信息管理、回收站点管理、站点分类管理、站点分类管理、留言板管理、系统管理进行添加、查询、修改、删除,以保障废弃资源回收系统系统的正常…...

【Java程序设计】【C00277】基于Springboot的招生管理系统(有论文)
基于Springboot的招生管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的招生管理系统 本系统分为系统功能模块、管理员功能模块以及学生功能模块。 系统功能模块:在系统首页可以查看首页、专业…...

汇编语言与接口技术实践——秒表
1. 设计要求 基于 51 开发板,利用键盘作为按键输入,将数码管作为显示输出,实现电子秒表。 功能要求: (1)计时精度达到百分之一秒; (2)能按键记录下5次时间并通过按键回看 (3)设置时间,实现倒计时,时间到,数码管闪烁 10 次,并激发蜂鸣器,可通过按键解除。 2. 设计思…...

【数据结构与算法】(19)高级数据结构与算法设计之 图 拓扑排序 最短路径 最小生成树 不相交集合(并查集合)代码示例
目录 6) 拓扑排序KahnDFS 7) 最短路径DijkstraBellman-FordFloyd-Warshall 8) 最小生成树PrimKruskal 9) 不相交集合(并查集合)基础路径压缩Union By Size 图-相关题目 6) 拓扑排序 #mermaid-svg-MQhLsXiMwnlUL3q4 {font-family:"trebuchet ms"…...

OSCP靶场--Nickel
OSCP靶场–Nickel 考点(1.POST方法请求信息 2.ftp,ssh密码复用 3.pdf文件密码爆破) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.237.99 -sV -sC -p- --min-rate 5000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-22 04:06 EST Nm…...

新建工程——库函数版
新建工程——库函数版 s t e p I : 新建工程文件夹 \bf{stepI:新建工程文件夹} stepI:新建工程文件夹 s t e p I I : K e i l 5 新建工程 \bf{stepII:Keil5新建工程} stepII:Keil5新建工程 s t e p I I I : 最终得到工程文件 \bf{stepIII:最终得到工程文件} stepIII:最终得到工…...

java 数据结构栈和队列
目录 栈(Stack) 栈的使用 栈的模拟实现 栈的应用场景 队列(Queue) 队列的使用 队列模拟实现 循环队列 双端队列 用队列实现栈 用栈实现队列 栈(Stack) 什么是栈? 栈 :一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操…...

#LLM入门|Prompt#1.8_聊天机器人_Chatbot
聊天机器人设计 以会话形式进行交互,接受一系列消息作为输入,并返回模型生成的消息作为输出。原本设计用于简便多轮对话,但同样适用于单轮任务。 设计思路 个性化特性:通过定制模型的训练数据和参数,使机器人拥有特…...

LeetCode 2476.二叉搜索树最近节点查询:中序遍历 + 二分查找
【LetMeFly】2476.二叉搜索树最近节点查询:中序遍历 二分查找 力扣题目链接:https://leetcode.cn/problems/closest-nodes-queries-in-a-binary-search-tree/ 给你一个 二叉搜索树 的根节点 root ,和一个由正整数组成、长度为 n 的数组 qu…...

选座位 - 华为OD统一考试(C卷)
OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 疫情期间,需要大家保证一定的社交距离,公司组织开交流会议,座位有一排共N个座位,编号分别为[0…N-1],要…...

【微服务】mybatis typehandler使用详解
目录 一、前言 二、TypeHandler简介 2.1 什么是TypeHandler 2.1.1 TypeHandler特点 2.2 TypeHandler原理 2.3 mybatis自带的TypeHandler 三、环境准备 3.1 准备一张数据表 3.2 搭建一个springboot工程 3.2.1 基础依赖如下 3.2.2 核心配置文件 3.2.3 测试接口 四、T…...

计网 - 深入理解HTTPS:加密技术的背后
文章目录 Pre发展历史Http VS HttpsHTTPS 解决了 HTTP 的哪些问题HTTPS是如何解决上述三个风险的混合加密摘要算法 数字签名数字证书 Pre PKI - 数字签名与数字证书 PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证 发展历史 HTTP(超文本传输协…...

Jmeter之单接口的性能测试
前言: 服务端的整体性能测试是一个非常复杂的概念,包含生成虚拟用户,模拟并发,分析性能结果等各种技术,期间可能还要解决设计场景、缓存影响、第三方接口mock、IP限制等问题。如何用有限的测试机器,在测试环…...

成像光谱遥感技术中的AI革命:ChatGPT应用指南
“成像光谱遥感技术中的人工智能革命:ChatGPT应用指南”,这是一门旨在改变您使用人工智能处理遥感数据的方式。将最新的人工智能技术与实际的遥感应用相结合,提供不仅是理论上的,而且是适用和可靠的工具和方法。无论你是经验丰富的…...