Binja incorrectly translating ILP32 tailcall pattern
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức phù hợp với người mới
- 45/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- cpp
- Lĩnh vực
- reverse-engineering
Hướng nghiên cứu
Start in arch/arm64/il.cpp at LoadStoreOperand and inspect how the AArch64 IL handles the 32-bit load into w17 followed by a jump through x17. Reproduce with the attached binary in Binja, navigate to strtoul in .plt, and confirm the 0x401dcc jump is translated with x17 as a resolved constant rather than an incorrect tag.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Bug Description:
Binja incorrectly translating AArch64 ILP32 tailcall pattern as a result of 32-bit load into w17 and jump through x17.
00401dc0 uint32_t strtoul(char const* str, char** endptr, int32_t base)
00401dc0 adrp x16, getspnam
00401dc4 ldr w17, [x16, #0x10c] {strtoul}
00401dc8 add w16, w16, #0x10c {strtoul}
❓00401dcc br x17
Steps To Reproduce:
Please provide all steps required to reproduce the behavior:
- Open the attached binary in Binja 5.3.9025 or later
- Navigate to
strtoulin.plt - Observe the tag at
0x401dccon thejump(zx.q(*getaddrinfo))
Expected Behavior:
Translate correctly resulting in x17 being a resolved constant value
Binary:
victory spring enters valuably
Additional Information:
This hack allows the PLT branches to the extern region to work fine, but this isn't a good solution and I think we need to fix this in core.
diff --git a/arch/arm64/il.cpp b/arch/arm64/il.cpp
index f02cdd2d..ab6ff084 100644
--- a/arch/arm64/il.cpp
+++ b/arch/arm64/il.cpp
@@ -905,8 +905,11 @@ static void LoadStoreOperand(LowLevelILFunction& il, bool load,
ILSETREG_O(operand1, il.Operand(1, il.Load(load_store_sz, ILREG_O(operand2)))));
break;
case MEM_OFFSET:
- if (!load_store_sz)
- load_store_sz = REGSZ_O(operand1);
+ if ((operand1.reg[0] >= REG_W0 && operand1.reg[0] <= REG_WSP) || (operand1.reg[0] >= REG_S0 && operand1.reg[0] <= REG_S31))
+ {
+ BNRegisterInfo regInfo = il.GetArchitecture()->GetRegisterInfo(operand1.reg[0]);
+ operand1.reg[0] = (Register)regInfo.fullWidthRegister;
+ }
// operand1.reg = [operand2.reg + operand2.imm]
if (IMM_O(operand2) == 0)
- Ngôn ngữ chính
- C++
- Star
- 1.3k
- Fork
- 298
- Merge trung bình
- 5 ngày 5 giờ
- Pull request đã merge (30 ngày)
- 19
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của Vector35/binaryninja-api
-
Độ khó 1/5 1-3 giờ Mức phù hợp với người mới 88/100
Vector35/binaryninja-api#8540 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
Vector35/binaryninja-api#8516 ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 92/100
Vector35/binaryninja-api#8503 ·
-
normalize time logs from WARP Đang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 88/100
Vector35/binaryninja-api#8446 ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 88/100
Vector35/binaryninja-api#8444 ·
Tất cả issue của Vector35/binaryninja-api
Issue tương tự
-
Độ khó 1/5 1-3 giờ Mức phù hợp với người mới 92/100
autowarefoundation/autoware_universe#13413 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
-
automated-analysis bug memory-safety
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 86/100
-
Sensor initialization takes very long when `--initial-sim-time` is set to current UNIX timestamp Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
gazebosim/gz-sensors#662 · 1 bình luận ·