ida pro分析elf文件(linux程序)

博客内容涉及一个数据库查询错误的日志分析,通过IDA Free工具解析程序,发现代码中可能存在的limit值为0的问题。日志显示SQL语法错误,代码检查显示在计算limit时存在置0操作。由于现场版本代码未在SVN上更新,导致了这个问题的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IDA Free: https://hex-rays.com/ida-free/#download

客户反馈的日志,可以看到FROM tbl_ud_pe_eventreport_network_sum limit 0 offset 1188 part F436B5F1BCEA75FB204A64C83EF4C90D7执行语句报错了。

[1597725][2021-08-18][12:03:35][T1096963840][HQueryDB.cpp        ][0303][I]query_acuta_db_table_part_info result: str_db_name:AuditDB,str_table_name:tbl_ud_pe_eventreport_network_sum,part count:2 index 0 : mi_count:2, mi_year:2019, mi_month:4, mi_day:0, mstr_file:000000.dat, mstr_fileid:FB8EFA0B01B0C5F5D8A20C0BA387EE38D, index 1 : mi_count:772, mi_year:2021, mi_month:8, mi_day:0, mstr_file:000000.dat, mstr_fileid:F436B5F1BCEA75FB204A64C83EF4C90D7,
[1597726][2021-08-18][12:03:35][T1096963840][HQueryDB.cpp        ][0586][I]run sql...... SELECT str_record_uuid,i_interval_second,str_dev_id,str_agent_id,i_opr_count,i_internet_send_bytes,i_internet_recv_bytes,i_local_send_bytes,i_local_recv_bytes,t_start FROM tbl_ud_pe_eventreport_network_sum  limit 0 offset 1188 part F436B5F1BCEA75FB204A64C83EF4C90D7
[1597727][2021-08-18][12:03:35][T1096963840][HQueryDB.cpp        ][0444][W]run sql: SELECT str_record_uuid,i_interval_second,str_dev_id,str_agent_id,i_opr_count,i_internet_send_bytes,i_internet_recv_bytes,i_local_send_bytes,i_local_recv_bytes,t_start FROM tbl_ud_pe_eventreport_network_sum  limit 0 offset 1188 part F436B5F1BCEA75FB204A64C83EF4C90D7error,SQL syntax error

回头翻了翻svn上的代码,发现所有版本的如下

		if(it_part_last_record_offset->second >= parts_info_node.mi_count)
		{
			HLog(HGET_INFO << L"part: " << parts_info_node.mstr_file_id << L" offset: " << it_part_last_record_offset->second << L" count: "<< parts_info_node.mi_count);
			return str_ret;
		}
		int i_limit_count = (tbl_info.i_limit_count == 0 ? (parts_info_node.mi_count -  it_part_last_record_offset->second):tbl_info.i_limit_count );
		str_ret<< L" limit "<<i_limit_count <<L" offset "<< it_part_last_record_offset->second;
		if(it_part_last_record_offset->second == parts_info_node.mi_count)
		{
			HLog(HGET_INFO << L"part: " << parts_info_node.mstr_file_id << L" offset: " << it_part_last_record_offset->second << L" count: "<< parts_info_node.mi_count);
			return str_ret;
		}
		int i_limit_count = (tbl_info.i_limit_count == 0 ? (parts_info_node.mi_count -  it_part_last_record_offset->second):tbl_info.i_limit_count );
		str_ret<< L" limit "<<i_limit_count <<L" offset "<< it_part_last_record_offset->second;

所有的版本都不可能limit 为 0的
然后我们用ida解析下现场发过来的程序
在这里插入图片描述
找到现场这个程序中这个函数f5看下他的伪代码,很明显这里在偏移和表中数据总量求limit的时候如果是小于0的话,会进行一个置0的操作,这样就可以解释现场的日志中出现了limit 0的情况了,现场版本的代码不曾在svn上维护过,至于原因是后话了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值