动态调试

快捷键

F9调试

F7步入

F8步过

ctrl+F5 退出调试

1、EASY

先查壳

1721275739405-86ee4b6f-8139-43f0-908b-962bbf8c80eb.png

然后放入32位ida,发现main上面有个可疑函数,进去看一下

1721277905448-03ceace4-5c2c-4592-9f2e-2eee9ed093b7.png

有个result=putchar,那大概是没跑了

1721277956809-8992b404-510c-47b1-9416-047066f24ed8.png

设置一下断点,修改汇编代码,直接将call main改成call ques

1721277996156-6717ccd9-ea2f-471d-a361-036f32d06d76.png

注意,先调试程序,再进行修改函数,

修改快捷键ctrl+alt+k

1721278087597-38200f83-bc9f-4e1a-ac4d-91a48803b710.png

然后F8步步跟进即可,两次就行

1721278242989-f4705a0a-5f76-4bd7-a01e-43bfddef85f5.png

1721275644106-8f422287-94b0-4576-8357-bac121730d74.png

NSSCTF{HACKIT4FUN}

2、string

查壳发现是linux文件,等会放到kali里面调试

1721370316119-7415c381-eb3f-46f0-bfa9-887b6e23965d.png

先放到64位ida

跟进flag函数,发现是个随机种子生成函数

1721370275150-d9ad6fd2-3ec6-4bb0-8b36-f8347af37b39.png

1721370369700-c6b41374-4367-4bcd-98eb-e68ad8d21b71.png

找到seed

1721370256797-58113b77-0e1e-4143-b728-9867aea8fe4f.png

然后编写脚本,按照种子生成伪随机数,即flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<stdlib.h>
int main()
{
int seed=0x2766;
int v4;
printf("NSSCTF{");
for( int m = 0; m < 13; ++m )
{
v4 =rand();
printf("%d", (unsigned int)(v4 % 8 + 1));
}
putchar(125);
return 0;
}

1721371725133-4a109ec4-9cde-4838-b4f8-ad6c18613a2a.png

注意win里面生成的是错误的

因为系统不同,所以生成的种子也不同

1721371756029-ecc85495-72e8-49a7-b22a-5ff7e5cb1511.png

3、getflag

注意:如果修改了汇编,patch后那么程序就会更改了,所以调试前最好备份一下

如果你这么玩的话,那我只能修改你汇编指令了

1721543796759-86019a10-f0bf-44ac-b135-7da5c6661c8e.png

1721544459743-6b4933db-25bf-421e-9e69-ab9bc417f268.png

点到左边的check函数里面,看到要99999999次的click才能getflag,玩呢

1721544541003-61823652-60d6-4c09-8795-6fb1638a046f.png

直接动态调试,先在比较cmp地方前面下一个断点1721556839738-a73b9ac7-7882-47f8-8a17-b02e26cdb767.png

第一种办法,将判断条件修改,jg改成jle

JG ;有符号大于则跳转

JLE ;有符号小于等于则跳转

1721548794441-06fefed3-aa4f-4d24-835c-d7ebaa3f3cb2.png

然后本地调试即可

1721548029980-acd6b0d0-d184-40c2-877b-5bf3a4f44d05.png

第二种,调试时修改寄存器的内容

CMP

功能: 比较OP1与OP2的值

语法: CMP r/m,r/m/data

标志位: C,P,A,Z,O

MOV

功能: 把源操作数送给目的操作数

语法: MOV 目的操作数,源操作数

格式: MOV r1,r2

MOV r,m

MOV m,r

MOV r,data


在比较cmp前面下个断点,然后F7步过进入cmp,修改左上角eax寄存器的值,只要大于0x5E5E0FFh

点击eax,右键modify,修改数值即可

1721551040498-86f5836c-2205-4dd9-9aea-d0d996495135.png

我这边就修改的比他大1,为5F5E1000,进了一位,然后再F7步过就可以跳到flag分支了

1721551388752-2c3260fd-7c9f-492e-aedb-ccb529ece0c8.png

1721551447323-ee15ef0a-c340-439d-b86e-3ffa4da9ecc8.png

1721551458819-a02738d9-f2ac-428f-a4e1-1bb07bdef89d.png

成功跳转后,F9运行程序即可

1721551205280-0d468676-ce93-4c86-ad1d-4994326f8e16.png

NSSCTF{MFC_pr0gr4mming_is_awes0m3}

4、贪吃蛇

32位

1721632502706-32eebb9a-c3d5-4a83-99d4-fa75788e1da1.png

放入ida,随便看一下函数

将jle改成jg,保存一下然后动调即可

1721632579200-053270d8-a944-412f-aa40-75c5e4445ce4.png

1721632347532-7f325c25-c1dd-4d21-9156-be0a75161de8.png

NSSCTF{YourAreTheMasterOfGame!}

更新: 2024-10-24 10:04:04
原文: https://www.yuque.com/chaye-apqbl/vsc85q/chld642z56nkhary


http://example.com/2026/01/19/RE/基础/动态调试/index/
Author
chaye
Posted on
January 19, 2026
Licensed under