公司为新员工每周安排了一节ETP课程,这周在上安全编码,课上一些实践内容在gdb调试下有助于理解,但发现Mac使用gdb似乎不是那么简单,特此记录以下大致流程.

  1. 通过homebrew安装gdb brew install gdb

    本以为这样就可以用了,gdb之后发现,Mac下需要对gdb进行签名.于是有了后面的流程.
  2. 打开Keychain Access, 在Menu中选择Certificate AssistantCreate -> a Certificate,在打开的窗口中创建证书.

    为证书命名,我使用了gdbcert,这个随意.下面的窗口分别选择

    Identity Type:Self Signed Root

    Certificate Type:Code Signing

    勾选Let me override defaults checkbox

  3. 之后一路Continue,直到Specify a Location For The Certificate页面,在下拉菜单中选择System.这里可能会报错Certificate Error: Unknown Error =-2,147,414,007如果这样,不选择System,选择Location,创建后把证书导入到System内.

  4. 完成后,在System里找到证书,双击,展开Trust列表,把Code Signing设置为Always Trust
  5. 在终端内输入killall taskgated
  6. 对gdb签名 codesign -fs gdbcert /usr/local/bin/gdb, 记得将名称更换为第二步设置的名称
  7. 网上不少教程到这里就结束了,但我到这里后,进入gdb进行run,发现仍然报错:please check gdb is codesigned see taskgated(8)
    需要加一步操作,编写一个gdb.xml文件,随后重新签名codesign --entitlements gdb.xml -fs gdbcert /usr/local/bin/gdb.All Done.
    gdb.xml文件内容如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>com.apple.security.cs.allow-jit</key>
    <true/>
    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
    <true/>
    <key>com.apple.security.cs.allow-dyld-environment-variables</key>
    <true/>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
    <key>com.apple.security.cs.disable-executable-page-protection</key>
    <true/>
    <key>com.apple.security.cs.debugger</key>
    <true/>
    <key>com.apple.security.get-task-allow</key>
    <true/>
    </dict>
    </plist>

最后

使用过程中发现在gdb里,不能使用类似于run < test.txt的命令从文件流中读入内容,求指导,不过估计从这里是求不到的了,-.-

原文链接 http://blog.wuqingzhe.cn/2019/12/03/在Mac上安装gdb/